Zackeezy
Zackeezy

Reputation: 74

Populating dropdown with data entered by other users

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>&nbsp;</td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td class="field-name">Last</td>
                <td class="field-name">First</td>
                <td class="field-name">Middle</td>
                <td>&nbsp;</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

Answers (0)

Related Questions