我有一个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 & 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中做到这一点,但我想我会尽可能在初始渲染中做到这一点。
答案 0 :(得分:0)
好吧,我要做的就是将前端值更改为model.ManagerIDs [index]并成功。