Reputation: 74
I have an ASP.NET MVC application that is hosted on a server that takes multiple users. The way the application works is that it has multiple pages that are all part of one larger form, so each page is a form that submits to the controller and the data is then joined into the model and stored in the session. I pulled the functionality for having buttons to navigate pages using code from this stack overflow post.
@{
ViewBag.Title = "Name";
}
@model RegisterViewModel
<main aria-labelledby="title">
@using (Html.BeginForm())
{
<p>
<table>
<tr>
<td class="field-name">Name:</td>
<td>@Html.TextBoxFor(model => model.LastName)</td>
<td>@Html.TextBoxFor(model => model.FirstName)</td>
<td>@Html.TextBoxFor(model => model.MiddleName)</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td class="field-name">Last</td>
<td class="field-name">First</td>
<td class="field-name">Middle</td>
<td> </td>
</tr>
</table>
<table>
<tr>
<td>@Html.LabelFor(model => model.AddressLine1) </td>
<td>@Html.TextBoxFor(model => model.AddressLine1)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.AddressLine2)</td>
<td>@Html.TextBoxFor(model => model.AddressLine2)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.AddressCity)</td>
<td>@Html.TextBoxFor(model => model.AddressCity)</td>
</tr>
<tr id="USOnly1">
<td>@Html.LabelFor(model => model.AddressState)</td>
<td>@Html.DropDownListFor(model => model.AddressState, RegisterViewModel.States)</td>
</tr>
<tr id="USOnly3">
<td>@Html.LabelFor(model => model.AddressZipCode)</td>
<td>@Html.TextBoxFor(model => model.AddressZipCode)</td>
</tr>
<tr id="USOnly4">
<td>@Html.LabelFor(model => model.AddressCounty)</td>
<td>@Html.TextBoxFor(model => model.AddressCounty)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.AddressCountry)</td>
<td>
@Html.DropDownListFor(model => model.AddressCountry, RegisterViewModel.Countries)
</td>
</tr>
</table>
</p>
<div>
<input type="submit" value="Back to Start" name="action:LoadHome" />
<input type="submit" value="Back" name="action:Previous" />
<input type="submit" value="Next" name="action:Next" id="Next" />
</div>
}
</main>
The view look like the above. This one has two drop downs: state and country. These lists are defined in the model.
public class RegisterViewModel
{
[Required]
[DataType(DataType.Text)]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Middle Name")]
public string MiddleName { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Address Line 1:")]
public string AddressLine1 { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Address Line 2:")]
public string AddressLine2 { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "City:")]
public string AddressCity { get; set; }
[DataType(DataType.Text)]
[Display(Name = "State:")]
public string AddressState { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Country:")]
public string AddressCountry { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Zip Code:")]
public string AddressZipCode { get; set; }
[DataType(DataType.Text)]
[Display(Name = "County:")]
public string AddressCounty { get; set; }
static public List<SelectListItem> Countries = new List<SelectListItem>()
{
new SelectListItem() {Text = "Select a Country" , Value = ""},
new SelectListItem() {Text = "USA" , Value = "US"},
new SelectListItem() {Text = "Afghanistan" , Value = "AF"},
new SelectListItem() {Text = "Albania" , Value = "AA"},
new SelectListItem() {Text = "Algeria" , Value = "AN"},
new SelectListItem() {Text = "American Samoa Islands" , Value = "AM"},
};
static public List<SelectListItem> States = new List<SelectListItem>()
{
new SelectListItem() {Text = "Select State" , Value = ""},
new SelectListItem() {Text = "Alabama" , Value = "Alabama"},
new SelectListItem() {Text = "Alaska" , Value = "Alaska"},
new SelectListItem() {Text = "Arizona" , Value = "Arizona"},
new SelectListItem() {Text = "Arkansas" , Value = "Arkansas"},
new SelectListItem() {Text = "California" , Value = "California"},
new SelectListItem() {Text = "Colorado" , Value = "Colorado"},
new SelectListItem() {Text = "Connecticut" , Value = "Connecticut"},
new SelectListItem() {Text = "Delaware" , Value = "Delaware"},
new SelectListItem() {Text = "Florida" , Value = "Florida"},
new SelectListItem() {Text = "Georgia" , Value = "Georgia"},
new SelectListItem() {Text = "Hawaii" , Value = "Hawaii"},
new SelectListItem() {Text = "Idaho" , Value = "Idaho"},
new SelectListItem() {Text = "Illinois" , Value = "Illinois"},
new SelectListItem() {Text = "Indiana" , Value = "Indiana"},
new SelectListItem() {Text = "Iowa" , Value = "Iowa"},
new SelectListItem() {Text = "Kansas" , Value = "Kansas"},
new SelectListItem() {Text = "Kentucky" , Value = "Kentucky"},
new SelectListItem() {Text = "Louisiana" , Value = "Louisiana"},
new SelectListItem() {Text = "Maine" , Value = "Maine"},
new SelectListItem() {Text = "Maryland" , Value = "Maryland"},
new SelectListItem() {Text = "Massachusetts" , Value = "Massachusetts"},
new SelectListItem() {Text = "Michigan" , Value = "Michigan"},
new SelectListItem() {Text = "Minnesota" , Value = "Minnesota"},
new SelectListItem() {Text = "Mississippi" , Value = "Mississippi"},
new SelectListItem() {Text = "Missouri" , Value = "Missouri"},
new SelectListItem() {Text = "Montana" , Value = "Montana"},
new SelectListItem() {Text = "Nebraska" , Value = "Nebraska"},
new SelectListItem() {Text = "Nevada" , Value = "Nevada"},
new SelectListItem() {Text = "New Hampshire" , Value = "New Hampshire"},
new SelectListItem() {Text = "New Jersey" , Value = "New Jersey"},
new SelectListItem() {Text = "New Mexico" , Value = "New Mexico"},
new SelectListItem() {Text = "New York" , Value = "New York"},
new SelectListItem() {Text = "North Carolina" , Value = "North Carolina"},
new SelectListItem() {Text = "North Dakota" , Value = "North Dakota"},
new SelectListItem() {Text = "Ohio" , Value = "Ohio"},
new SelectListItem() {Text = "Oklahoma" , Value = "Oklahoma"},
new SelectListItem() {Text = "Oregon" , Value = "Oregon"},
new SelectListItem() {Text = "Pennsylvania" , Value = "Pennsylvania"},
new SelectListItem() {Text = "Rhode Island" , Value = "Rhode Island"},
new SelectListItem() {Text = "South Carolina" , Value = "South Carolina"},
new SelectListItem() {Text = "South Dakota" , Value = "South Dakota"},
new SelectListItem() {Text = "Tennessee" , Value = "Tennessee"},
new SelectListItem() {Text = "Texas" , Value = "Texas"},
new SelectListItem() {Text = "Utah" , Value = "Utah"},
new SelectListItem() {Text = "Vermont" , Value = "Vermont"},
new SelectListItem() {Text = "Virginia" , Value = "Virginia"},
new SelectListItem() {Text = "Washington" , Value = "Washington"},
new SelectListItem() {Text = "West Virginia" , Value = "West Virginia"},
new SelectListItem() {Text = "Wisconsin" , Value = "Wisconsin"},
new SelectListItem() {Text = "Wyoming" , Value = "Wyoming"},
new SelectListItem() {Text = "Washington DC" , Value = "Washington DC"}
};
}
With each page load, the session is checked for the model, and the model is also passed as a parameter to each controller, and the parameter is joined together with the session and stored back into the session.
public class NameController : Controller
{
public ActionResult Index(RegisterViewModel model)
{
if (ModelState.IsValid)
{
//_model = model;\
if (Session["model"] == null)
{
Session["Model"] = model;
}
else
{
model = Session["model"] as RegisterViewModel;
}
}
else
{
model = Session["model"] as RegisterViewModel;
}
return View(model);
}
[HttpPost]
[MultipleButton(Name = "action", Argument = "LoadPrevious")]
public ActionResult LoadPrevious(RegisterViewModel model)
{
RegisterViewModel rvm;
if (Session["Model"] == null)
{
rvm = new RegisterViewModel();
}
else
{
rvm = Session["Model"] as RegisterViewModel;
}
rvm = RegisterViewModel.JoinModels(model, rvm);
Session["model"] = rvm;
return RedirectToAction("Index", "Previous", new { Message = "" });
}
[HttpPost]
[MultipleButton(Name = "action", Argument = "LoadNext")]
public ActionResult LoadNext(RegisterViewModel model)
{
RegisterViewModel rvm;
if (Session["Model"] == null)
{
rvm = new RegisterViewModel();
}
else
{
rvm = Session["Model"] as RegisterViewModel;
}
rvm = RegisterViewModel.JoinModels(model, rvm);
Session["model"] = rvm;
return RedirectToAction("Index", "Next", new { Message = "" });
}
[HttpPost]
[MultipleButton(Name = "action", Argument = "LoadHome")]
public ActionResult LoadHome(RegisterViewModel model)
{
RegisterViewModel rvm;
if (Session["Model"] == null)
{
rvm = new RegisterViewModel();
}
else
{
rvm = Session["Model"] as RegisterViewModel;
}
rvm = RegisterViewModel.JoinModels(model, rvm);
Session["model"] = rvm;
return RedirectToAction("Index", "Home", new { Message = "" });
}
}
I have not been able to replicate it locally, but when it's on a server, one user changes a value in a dropdown and presses next, and another user sees that value in the dropdown on a different machine even though they didn't select it. I'm also seeing that selecting a value on one dropdown can sometimes cause future dropdowns built from the same list but tied to different fields in the model are automatically set to the same value.
I will note, this is not happening with lists where the values are true/false and the model field is boolean. We have been troubleshooting this issue for a long time and have had no luck figuring out the issue, and it is difficult to find anyone with a similar issue online.
Any help would be appreciated. Let me know if any more info is needed.
Upvotes: 0
Views: 43