我有一个表单来更新实体“Item”,它有一个类别的下拉列表。所以它的模型有两个属性:string CategoryName和List AvailableCategories。在我看来,我将组合用户组合框,根据两者的值选择一个类别:
@if (Model != null && Model.AvailableCategories != null)
{
List<SelectListItem> selectListItem = new List<SelectListItem>();
foreach (var catName in Model.AvailableCategories)
{
selectListItem.Add(new SelectListItem() { Text = catName, Value = catName, Selected = (catName == Model.CategoryName) });
}
if (string.IsNullOrEmpty(Model.CategoryName))
{
@Html.DropDownList("CategoryName", selectListItem, "Select Category")
}
else
{
@Html.DropDownList("CategoryName", selectListItem)
}
}
因此下拉列表已准备就绪,当用户提交时,CategoryName将会更新。但问题是当用户提交表单时,属性List AvailableCategories为null。在我的httppost控制器代码中,如果我需要执行一些服务器端验证:
[HttpPost]
public ActionResult NewItem(NewItemViewModel itemModel, string submit)
{
if (contact server and find validation failed here)
{
ModelState.AddModelError("ItemName", "Server said it's not valid");
return View(itemModel);
}
}
现在返回的模型“itemModel”将AvailableCategories设置为null,因为它不在表单中。如果我真的需要在服务器端进行此操作,我需要再次查询数据库以填充此列表,这是无效的。在提交期间,最优雅的方法是将这个帮助器DataStructure组合回来?
我在客户端可以想到的是#1:添加隐藏字段以保存所有字符串以便可以回发,或者#2添加提交功能以将所有数据组合到模型中,然后从脚本发布。然后,如果存在服务器验证错误,我需要逐行将这些错误匹配到正确的验证字段...