【问题标题】:ASP.NET MVC Binding to a dictionaryASP.NET MVC 绑定到字典
【发布时间】:2011-07-08 15:47:33
【问题描述】:

我正在尝试在 MVC 中绑定字典值。

在我的行动范围内:

model.Params = new Dictionary<string, string>();

model.Params.Add("Value1", "1");
model.Params.Add("Value2", "2");
model.Params.Add("Value3", "3");

在我的视野内:

@foreach (KeyValuePair<string, string> kvp in Model.Params)
{ 
<tr>
  <td>
    <input type="hidden" name="Params.Key" value="@kvp.Key" />
    @Html.TextBox("Params[" + kvp.Key + "]")
  </td>
</tr>
}

但是视图不显示初始值,提交表单时Params属性为空?

【问题讨论】:

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


    【解决方案1】:

    在 ASP.NET MVC 4 中,默认模型绑定器将使用典型的字典索引器语法 property[key] 绑定字典。

    如果您的模型中有 Dictionary&lt;string, string&gt;,您现在可以使用以下标记直接绑定回它:

    <input type="hidden" name="MyDictionary[MyKey]" value="MyValue" />
    

    例如,如果您想使用一组复选框来选择字典元素的子集并绑定回相同的属性,您可以执行以下操作:

    @foreach(var kvp in Model.MyDictionary)
    {
        <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")"
            value="@kvp.Value" />
    }
    

    【讨论】:

    • 谢谢你,一个很好的绑定方式。
    • 有人可以提供任何链接到更详细的答案吗?尝试了 Dictionary 并没有成功,所以我不得不使用旧的索引器语法。
    • 似乎不适用于数字键,但适用于字符串。
    • @Ant P 我有两个输入文本框,一个用于 key ,一个用于 value 。我如何映射这些?
    • 使用 JavaScript 将字段动态添加到 html Dom 时,如何使用此/绑定字典?好的
    【解决方案2】:

    你应该看看 scott hanselman 的这篇文章: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

    默认的活页夹只理解格式的字典:

    params[0].key = kvp.key
    params[0].value = kvp.value
    

    参数的索引必须是连续的,从 0 开始并且没有任何间隙。目前的助手不支持这个,所以你应该自己创建表单输入字段。

    您当然可以实现自己的活页夹,例如: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/

    【讨论】:

      【解决方案3】:

      以@AntP 的回答为基础,还有一种更简洁的方式,让 MVC 完成更多工作(至少在 Dictionary&lt;string, string&gt; 上使用 TextBoxFor() - 我还没有在 Dictionary&lt;xxx, bool&gt; 上尝试过 CheckBoxFor() ):

      @foreach(var kvp in Model.MyDictionary)
      {
          @Html.Label(kvp.Key);
          @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]);
      }
      

      【讨论】:

      • CheckBoxFor 可以与Dict&lt;string, bool&gt; 一起使用,但在您想要绑定回特定键/值对且值不仅仅是布尔值的任何情况下它都不起作用 - 这样做您需要自己构建标记(如我的示例所示)。
      • 为什么这只适用于布尔值?我得到这个也适用于 Dict ,我不明白为什么它不应该适用于其他数据类型。
      • @KaiWeber - 这可能适用于任何Dictionary&lt;X, Y&gt;(事实上,&lt;string, string&gt; 是我在回答中使用的)。但是,我没有用其他任何东西对其进行测试。我认为 Ant P 说的是它只适用于类型化字典 (Dictionary&lt;&gt;),而不适用于非泛型集合,如 IDictionary
      • 我刚刚使用Dictionary&lt;Enum, string&gt; 进行了尝试,但没有成功。如果我改用Dictionary&lt;string, string&gt;,它可以工作。有人对此有解释吗?
      • 我的经验是值可以是任何值,但键必须是string 而不是int。也许模型绑定器将其与位置参数混淆了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2014-04-10
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多