具有相同名称的多个下拉列表预选择了不同的值

时间:2019-07-16 16:49:15

标签: c# model-view-controller html.dropdownlistfor

我有一个MVC应用程序,该应用程序接受给定部门的Manager ID列表。每个部门可以有零个或多个经理。为此,有一个包含所有可用管理器的初始下拉列表。如果用户希望添加另一个管理器,则单击“添加管理器”按钮,将向部分视图发出ajax请求,该视图返回新的管理器列表(名称控制名称,但ID值不同)。提交表单后,可以轻松访问经理ID的数组,但是在编辑时,任何在下拉列表中预先选择条目的尝试都会导致所有下拉列表具有相同的选定条目。我认为这是由于下拉列表都具有相同的名称。

在下拉列表的生成和控制器中,我都尝试过预选列表项,但都无效。

ViewModel:

public class AddDepartmentVM
{
    // Form data
    public List<int> ManagerIDs { get; set; }
}

初始视图:

using (Html.BeginForm("AddDepartment", "Departments", FormMethod.Post, new { id = "addDepartment", className = "form", role = "form" }))
 {
  @Html.AntiForgeryToken()
  @Html.ValidationSummary(true, null, new { @class = "text-danger" })

  // Hide the ID field
  @Html.HiddenFor(model => model.ID);

  <div class="form-row container">
   <div class="row">
    <div class="col-sm">
     <label for="Description">Department Name</label>
    </div>
    <div class="col-sm">
     @Html.EditorFor(model => model.Description, new { @class = "test-class", aria_describedby = "descriptionHelp", placeholder = Html.DisplayNameFor(model => model.Description) })
     <small id="descriptionHelp" class="form-text text-muted">Department names should be approved by Corporate &amp IT.</small>
     @Html.ValidationMessageFor(model => model.Description, null, new { @class = "text-danger" })
    </div>
   </div>

   <div class="row">
    <div class="col-sm">
     <label for="RecordStatusID">Status</label>
    </div>
    <div class="col-sm">
     @Html.DropDownListFor(model => model.RecordStatusID, new SelectList(recordStatuses.SearchResults, "ID", "Description"), new { @class = "some-class" })
     @Html.ValidationMessageFor(model => model.RecordStatusID, null, new { @class = "text-danger" })
    </div>
   </div>

  </div>
  <div class="form-row container">
   <div class="row">
    <div class="col-sm">
     <label for="Manager">Manager</label>
    </div>
    <div class="col-sm">
     @for (int index = 0; index < managerCount; index++)
     {
      // Declarations
      int selectedID = (Model.ManagerIDs != null && Model.ManagerIDs[index] != 0) ? Model.ManagerIDs[index] : 0;

      // If this was an actual manager
      if (Model.ManagerIDs != null && Model.ManagerIDs[index] != 0)
      {
       // Save the selctedID
       selectedID = Model.ManagerIDs[index];
      }

      <div>
       @Html.DropDownListFor(model => model.ManagerIDs, ViewData["managerList" + index.ToString()] as SelectList, "- Select -", new { @class = "some-class manager-list", id = "ManagerIDs[" + index + "]" })
       <a class="btn btn-danger delete-manager disabled" href="#" role="button" disabled>Delete</a>
      </div>
     }

     <a id="addManager" class="btn btn-primary add-manager disabled" href="#" role="button" disabled>Add Manager</a>
    </div>
   </div>
  </div>

部分视图:

@{
 // Page setup
 Layout = null;

 // Get the drop down field values from the ViewData object
 ContactsSearchResultsVM managerList = ViewData["managerList"] as ContactsSearchResultsVM;

 // Declarations
 string controlID = "ManagerIDs[" + ViewBag.ManagerID + "]";
}

<div>
 @Html.DropDownList("ManagerIDs", new SelectList(managerList.SearchResults, "ID", "ShortDisplayName"), "- Select -", new { @class = "some-class manager-list", id = controlID })
 <a class="btn btn-danger delete-manager disabled" href="#" role="button" disabled>Delete</a>
</div>

控制器:

public ActionResult AddDepartment(AddDepartmentVM viewModel)
{
    // Declarations
    bool result = false;
    ContactsSearchResultsVM managerList = new ContactsSearchResultsVM(0, 0, 0, 0, null);
    RecordStatusXRefSearchResultsVM recordStatuses = new RecordStatusXRefSearchResultsVM(0, 0, 0, 0, null);


    try
    {
        // Get a list of all possible managers
        managerList = ContactsSearch.SearchContactsTableQuick(new ContactsSearchCriteria
        {
            FromCache = true,
            CacheResults = true,
            CacheDurationInMinutes = 60
        });

        // Get a list of statuses
        recordStatuses = RecordStatusXRefSearch.SearchRecordStatusXRefTable(
                            new RecordStatusXRefSearchCriteria
                            {
                                ExcludeIDs = new List<int>() { 0 }
                            });

        ViewData["managerList"] = managerList;
        ViewData["recordStatuses"] = recordStatuses;


        for (int i = 0; i < viewModel.ManagerIDs.Count; i++)
        {
            ViewData["managerList" + i.ToString()] = new SelectList(managerList.SearchResults, "ID", "ShortDisplayName", viewModel.ManagerIDs[i]);
        }

        // Return the view
        return View("AddDepartment", viewModel);

单击“添加管理器”按钮将调用服务器返回部分视图,获取HTML并将其附加到表单中。一切都在提交数据,只是下拉列表中提交值的预选不起作用。

我可以在jQuery中做到这一点,但我想我会尽可能在初始渲染中做到这一点。

1 个答案:

答案 0 :(得分:0)

好吧,我要做的就是将前端值更改为model.ManagerIDs [index]并成功。

相关问题