我是ASP.NET MVC的新手,虽然我知道无知不是一个借口,但我找不到类似问题的任何帮助(对我而言)。
问题:
我的ModelState
无效,因为我已使用Html.DropDownListFor( r => r.Id, ((IEnumerable<SelectListItem>)ViewBag.PossibleRoles))
将RoleDTO模型的ID(在begincollectionitem中的局部视图中的模型)绑定到下拉列表。因此,RoleDTO模型的Name属性始终为空,ModelState
验证失败。我该如何正确处理这种情况?
详细信息:
我有N-N关系的用户和角色模型及其DTO。
我有一个UserController,其中我有创建/编辑操作。以下是编辑GET和POST操作的外观:
[HttpGet]
public ActionResult Edit(int id)
{
var model = userRepository.Get(id);
LoadPossibleRoles();
return View(model);
}
[HttpPost]
public ActionResult Edit(UserDTO model)
{
if (ModelState.IsValid)
{
userRepository.InsertOrUpdate(model);
userRepository.Save();
return RedirectToAction("Index");
}
else
{
LoadPossibleRoles();
return View(model);
}
}
LoadPossibleRoles()
所做的是从存储库中检索所有角色,将它们转换为SelectListItem
并将它们放入viewbag中(我应该创建一个viewmodel或者其他东西,但我不确定如何创建/在我的情况下使用一个)。它看起来像这样:
private void LoadPossibleRoles()
{
var availableRoles = roleRepository.GetAll();
var selectItems = new List<SelectListItem>();
foreach (var role in availableRoles)
{
var listItem = new SelectListItem();
listItem.Value = role.Id.ToString();
listItem.Text = role.Name;
selectItems.Add(listItem);
}
ViewBag.PossibleRoles = selectItems;
}
我有一个_CreateOrEdit局部视图,其模型是UserDTO,其中每个添加的角色都有_SingleRoleEdit部分。它看起来像这样:
<a href="javascript:insertNewRole()" class="insert-new-role">Add a role</a>
@foreach( var r in Model.Roles)
{
@Html.Partial("_SingleRoleEdit", r)
}
insertNewRole()
js函数是一个ajax调用,在UserController中调用“CreateNewRole”方法。该方法如下所示:
public PartialViewResult CreateNewRole()
{
LoadPossibleRoles();
return PartialView("_SingleRoleEdit", new RoleDTO());
}
最后在_SingleRoleEdit
部分,我为所有可用角色生成下拉列表:
@using (Html.BeginCollectionItem("Roles"))
{
<table class="editor-table">
<tr>
<th>Role</th>
<td>@Html.DropDownListFor( r => r.Id, ((IEnumerable<SelectListItem>)ViewBag.PossibleRoles))</td>
<td><a href="javascript:void(0)" onclick="removeItem(this);">X</a></td>
</tr>
</table>
}
在表现上,这应该是正常的。我可以添加/删除实际显示所有可用角色的下拉列表。 “问题”是数据绑定当前的工作方式。 DropDownListFor
将下拉列表中的选定值绑定到模型ID,但是目前没有任何内容将名称绑定到下拉列表的文本,这就是我的ModelState
在Post上始终无效的原因。我知道将下拉列表中的选择文本绑定到模型是一个坏主意。所以我正在寻找一种适当的方法来处理这种情况。