【问题标题】:MVC model-binding to a dictionary with list (IEnumerable) as valueMVC 模型绑定到以列表(IEnumerable)为值的字典
【发布时间】:2016-06-21 20:25:45
【问题描述】:

在我的应用程序中,我想让用户能够将其他用户添加到单个角色。 因此我的模型包含一个IDictionary<string, IEnumerable<string>>,其中键是角色的名称,值是将设置为给定角色的用户名列表。

但是,我正在努力解决如何发布此内容(或事件如何在我的表单中创建隐藏字段),以便我可以在我的操作中访问字典。

This article 似乎解决了一个相关问题,但我没有设法发布正确的数据。

目前我的代码如下所示:

foreach (var roleToUserRelation in Model.RoleUserRelations)
{
    @Html.Hidden(Html.NameFor(m => m.RoleUserRelations) + ".Index", s)
    @Html.HiddenFor(m => m.RoleUserRelations[s]);

    // loop through each user
    foreach (var userName in roleToUserRelation.Value)
    {
        // get the list somehow rendered to be posted as value for the dictionary
        @Html.Hidden(m => userName)
    }
}

是否可以这样做,或者我应该重新考虑模型结构以避免在这里使用字典?

【问题讨论】:

  • 您不能使用foreach 循环为集合生成表单控件(请参阅this answer),并且在视图中使用字典是最糟糕的类型。只需使用带有 IList<string> 属性的视图模型
  • 但是既然你只显示了隐藏的输入,那么这有什么意义呢?
  • 这些值是通过Javascript 设置的,所以隐藏字段对于这种情况来说已经足够了,它更多的是关于如何命名以使模型绑定器根据需要工作
  • @StephenMuecke 如何使用IList<string> 帮助?我怎么知道列表属于哪里(属于哪个角色)?甚至角色也是某种动态的,因此每个角色的列表都是不可行的。
  • 使用视图模型来表示您想要显示和编辑的内容。从您发布的内容中无法判断,但最好的猜测是您希望它具有属性string RoleList<string> Users,然后视图将是@model List<yourModel>。但是,如果您希望用户编辑某些内容,则使用隐藏输入毫无意义

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


【解决方案1】:

您应该使用一个复选框列表,它将是用户,角色名称应该在隐藏字段中。在表单发布上,您可以选中所有复选框。 您的模型应该有 2 个属性,一个用于收集用户名,另一个是 角色名称。 当你发布表单时,mvc 会自动绑定模型。

如果您有任何疑问,请随时问我。

如果我帮助将此帖子标记为答案

搜索如何创建复选框列表非常简单,您只需将所有复选框放在一个组名中即可。

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多