Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# begincollectionitem内的ASP.NET MVC 4 dropdownlist绑定_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# begincollectionitem内的ASP.NET MVC 4 dropdownlist绑定

C# begincollectionitem内的ASP.NET MVC 4 dropdownlist绑定,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我是ASP.NETMVC的新手,虽然我知道无知不是借口,但我无法从类似的问题中找到任何有用的答案 问题: 我的ModelState无效,因为我已使用Html.DropDownListFor(r=>r.id,((IEnumerable)ViewBag.PossibleRoles))将RoleDTO模型(位于begincollectionitem中的部分视图中的模型)的id绑定到dropdownlist。因此,RoleDTO模型的Name属性始终为空,并且ModelState验证失败。我如何正确处理

我是ASP.NETMVC的新手,虽然我知道无知不是借口,但我无法从类似的问题中找到任何有用的答案

问题:

我的
ModelState
无效,因为我已使用
Html.DropDownListFor(r=>r.id,((IEnumerable)ViewBag.PossibleRoles))将RoleDTO模型(位于begincollectionitem中的部分视图中的模型)的id绑定到dropdownlist
。因此,RoleDTO模型的Name属性始终为空,并且
ModelState
验证失败。我如何正确处理这种情况

详细信息:

我有N-N关系的用户和角色模型,以及他们的DTO

我有一个UserController,其中有创建/编辑操作。以下是“编辑获取”和“发布”操作的外观:

    [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
s并将它们放入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;
    }
<a href="javascript:insertNewRole()" class="insert-new-role">Add a role</a>

@foreach( var r in Model.Roles)
{
    @Html.Partial("_SingleRoleEdit", r)
}
    public PartialViewResult CreateNewRole()
    {
        LoadPossibleRoles();
        return PartialView("_SingleRoleEdit", new RoleDTO());
    }
最后,在
\u 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>
}
@使用(Html.BeginCollectionItem(“角色”))
{
角色
@DropDownListFor(r=>r.Id,((IEnumerable)ViewBag.PossibleRoles))
}

代表性地说,这是应该的。我可以添加/删除实际显示所有可用角色的下拉列表。“问题”是数据绑定当前的工作方式
DropDownListFor
将dropdownlist中的选定值绑定到模型Id,但是当前没有将名称绑定到dropdownlist的文本,这就是为什么我的
ModelState
在Post中总是无效的原因。我知道将dropdownlist中选择的文本绑定到模型是个坏主意。所以我在寻找一个合适的方法来处理这种情况

如果
Role.Name=null
如果导致模型状态错误,我假设您在Role.Name属性上有一个防止null或空字符串的属性?如果是这样的话,有不能删除它的原因吗?@StephenMuecke的确,我在RoleDTO.Name属性上有一个
[必需(AllowEmptyStrings=false)]
注释,我完全忘记了这个注释。我可以删除注释,它可能会工作,但我有一个更大的问题:这是处理这种情况的好方法吗?假设您只将User.Role.ID保存到数据库,然后立即重定向,那么您真的需要name属性吗?我建议不要,但您可以创建一个隐藏的输入('@HiddenFor(r=>r.Name)`,然后在select的更改事件中,获取所选选项并将其分配给输入-如果您需要代码示例,请告诉我。@StephenMuecke当前在保存用户之前,我提取收集的Id,然后用从数据库收集的符合收集的Id的角色替换角色集合。在我看来,这是一种可怕的d方式我可能应该制作一些ViewModel并将所选下拉列表值收集到一些int集合或其他东西中,而不是使用RoleDTO,但是我不知道怎么做(因为我使用的是BeginCollectionItem),听起来你有一个包含IEnumerable的用户类?