【问题标题】:MVC3 model binder fails to bind Dictionary<string, bool> that is part of my ViewModelMVC3 模型绑定器无法绑定我的 ViewModel 中的 Dictionary<string, bool>
【发布时间】:2012-07-16 17:27:50
【问题描述】:

我不知道我在搞砸什么。 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>

【问题讨论】:

  • 我不认为默认的模型绑定器可以做到这一点。
  • 我很确定这是序列化字典的问题,.Net 如果不做一些额外的工作就无法做到。

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


【解决方案1】:

您能否尝试删除“模型”。复选框助手声明的前缀。

代替

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

【讨论】:

  • 难以置信这是多么简单。这就是按惯例编码可以真正让你陷入困境的地方。如果我知道怎么做,我很乐意给一个奖励,如果你能指出一个关于模型绑定器约定的资源。
  • 这是一篇不错的 SO 帖子,其中包含一些资源,涵盖模型绑定 stackoverflow.com/questions/5692964/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
相关资源
最近更新 更多