Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# MVC3型号绑定器无法绑定字典<;字符串,bool>;这是我的ViewModel的一部分_C#_Asp.net Mvc 3_Razor_Dictionary_Model Binding - Fatal编程技术网

C# MVC3型号绑定器无法绑定字典<;字符串,bool>;这是我的ViewModel的一部分

C# MVC3型号绑定器无法绑定字典<;字符串,bool>;这是我的ViewModel的一部分,c#,asp.net-mvc-3,razor,dictionary,model-binding,C#,Asp.net Mvc 3,Razor,Dictionary,Model Binding,我搞不清楚我搞砸了什么。FormCollection似乎表明一切都是正确的角色名也很好地恢复了。那么为什么RoleMembership返回null 型号: public class EditRoleMembershipViewModel { public string RoleName { get; set; } public Dictionary<string, bool> RoleMembership { get; set; } } [HttpGet] publ

我搞不清楚我搞砸了什么。
FormCollection
似乎表明一切都是正确的<代码>角色名也很好地恢复了。那么为什么
RoleMembership
返回
null

型号

public class EditRoleMembershipViewModel
{
    public string RoleName { get; set; }
    public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
    var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};

    var allUsers = _userServices.GetAllUsers();
    getRolesForUsers(allUsers);
    var role = _roleServices.GetRole(roleName);

    viewModel.RoleMembership = new Dictionary<string, bool>();
    foreach (var user in allUsers)
    {
        var isMember = user.Roles != null && user.Roles.Contains(role);
        viewModel.RoleMembership.Add(user.UserName, isMember);
    }

    return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
    ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <table>
        <thead>
            <tr>
                <th>
                </th>
                <th>
                    In Role
                </th>
            </tr>
        </thead>
        <tbody>
            @{
                int index = 0;
                foreach (var item in Model.RoleMembership)
                {
                    <tr>
                        <td>
                            @item.Key
                            @Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
                        </td>
                        <td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
                    </tr>
                    index++;
                }
            }
        </tbody>
    </table>

    <p>
        <input type="submit" value="Save" />
    </p>
}
<div>
    @Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
公共类EditRoleMembershipViewModel
{
公共字符串RoleName{get;set;}
公共字典角色记忆{get;set;}
}
控制器动作

public class EditRoleMembershipViewModel
{
    public string RoleName { get; set; }
    public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
    var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};

    var allUsers = _userServices.GetAllUsers();
    getRolesForUsers(allUsers);
    var role = _roleServices.GetRole(roleName);

    viewModel.RoleMembership = new Dictionary<string, bool>();
    foreach (var user in allUsers)
    {
        var isMember = user.Roles != null && user.Roles.Contains(role);
        viewModel.RoleMembership.Add(user.UserName, isMember);
    }

    return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
    ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <table>
        <thead>
            <tr>
                <th>
                </th>
                <th>
                    In Role
                </th>
            </tr>
        </thead>
        <tbody>
            @{
                int index = 0;
                foreach (var item in Model.RoleMembership)
                {
                    <tr>
                        <td>
                            @item.Key
                            @Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
                        </td>
                        <td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
                    </tr>
                    index++;
                }
            }
        </tbody>
    </table>

    <p>
        <input type="submit" value="Save" />
    </p>
}
<div>
    @Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
[HttpGet]
公共操作结果EditRoleMembership(字符串roleName)
{
var viewModel=neweditrolemembershipviewmodel{RoleName=RoleName};
var allUsers=_userServices.GetAllUsers();
getRolesForUsers(allUsers);
var role=_roleServices.GetRole(roleName);
viewModel.RoleMembership=新字典();
foreach(allUsers中的var用户)
{
var isMember=user.Roles!=null&&user.Roles.Contains(role);
viewModel.RoleMembership.Add(user.UserName,isMember);
}
返回视图(viewModel);
}
查看

public class EditRoleMembershipViewModel
{
    public string RoleName { get; set; }
    public Dictionary<string, bool> RoleMembership { get; set; }
}
[HttpGet]
public ActionResult EditRoleMembership(string roleName)
{
    var viewModel = new EditRoleMembershipViewModel {RoleName = roleName};

    var allUsers = _userServices.GetAllUsers();
    getRolesForUsers(allUsers);
    var role = _roleServices.GetRole(roleName);

    viewModel.RoleMembership = new Dictionary<string, bool>();
    foreach (var user in allUsers)
    {
        var isMember = user.Roles != null && user.Roles.Contains(role);
        viewModel.RoleMembership.Add(user.UserName, isMember);
    }

    return View(viewModel);
}
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
    ViewBag.Title = "Edit Role";
}
<h2>@ViewBag.Title: @Model.RoleName</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <table>
        <thead>
            <tr>
                <th>
                </th>
                <th>
                    In Role
                </th>
            </tr>
        </thead>
        <tbody>
            @{
                int index = 0;
                foreach (var item in Model.RoleMembership)
                {
                    <tr>
                        <td>
                            @item.Key
                            @Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
                        </td>
                        <td>@Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)</td>
                    </tr>
                    index++;
                }
            }
        </tbody>
    </table>

    <p>
        <input type="submit" value="Save" />
    </p>
}
<div>
    @Html.ActionLink("Back to Details", "RoleDetails", new { Model.RoleName })
</div>
@model CI.Portal.Mvc.ViewModels.EditRoleMembershipViewModel
@{
ViewBag.Title=“编辑角色”;
}
@ViewBag.Title:@Model.RoleName
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
扮演
@{
int指数=0;
foreach(Model.RoleMembership中的var项)
{
@项目.关键
@Html.Hidden(string.Format(“model.RoleMembership[{0}].Key”,index),item.Key)
@CheckBox(string.Format(“model.RoleMembership[{0}].Value”,索引),item.Value)
索引++;
}
}

} @ActionLink(“回到细节”,“RoleDetails”,新的{Model.RoleName})
能否尝试从复选框助手声明中删除“model.”前缀

而不是

<td>
    @item.Key
    @Html.Hidden(string.Format("model.RoleMembership[{0}].Key", index), item.Key)
</td>
<td>
    @Html.CheckBox(string.Format("model.RoleMembership[{0}].Value", index), item.Value)
</td>

@项目.关键
@Html.Hidden(string.Format(“model.RoleMembership[{0}].Key”,index),item.Key)
@CheckBox(string.Format(“model.RoleMembership[{0}].Value”,索引),item.Value)
这样做:

<td>
    @item.Key
    @Html.Hidden(string.Format("RoleMembership[{0}].Key", index), item.Key)
</td>
<td>
    @Html.CheckBox(string.Format("RoleMembership[{0}].Value", index), item.Value)
</td>

@项目.关键
@隐藏(string.Format(“RoleMembership[{0}].Key”,索引),item.Key)
@CheckBox(string.Format(“RoleMembership[{0}].Value”,索引),item.Value)

我认为默认的model binder无法做到这一点。我很确定这就是序列化词典的问题,如果不做一些额外的工作,.Net是无法做到的。难以置信,这是多么简单。在这方面,按惯例编码真的会让你后悔莫及。如果我知道怎么做,如果你能给我一个关于模型绑定器的约定的资源,我很乐意给你一个奖励