begincollectionitem中的ASP.NET MVC 4下拉列表绑定

时间:2014-06-22 08:54:42

标签: c# asp.net-mvc asp.net-mvc-4

我是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上始终无效的原因。我知道将下拉列表中的选择文本绑定到模型是一个坏主意。所以我正在寻找一种适当的方法来处理这种情况。

0 个答案:

没有答案