MVC3模型绑定器无法绑定Dictionary <string,bool =“”>这是我的ViewModel的一部分</string,>

时间:2012-07-16 17:27:50

标签: c# asp.net-mvc-3 razor dictionary model-binding

我无法弄清楚我搞砸了什么。 FormCollection似乎表明一切都是正确的。 RoleName也很好。那么为什么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>

1 个答案:

答案 0 :(得分:3)

您可以尝试删除“模型”吗?复选框助手声明中的前缀。

而不是

<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>

这样做:

<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>