【问题标题】:MVC Model Binding to Dictionary by Key with HTML Helper使用 HTML Helper 按键绑定到字典的 MVC 模型
【发布时间】:2015-07-27 21:13:43
【问题描述】:

在 MVC(4) 中过滤数据列表时,我将几个过滤器输入绑定到位于 ViewModel 模型中的字典。

我已经能够通过这样的输入文字声明来做到这一点(.aspx 引擎):

 <input type="text" name='Model.Filters[matchId].Filter' 
                    value='<%: Model.Filters["matchId"].Filter %>' />

其中“matchId”是要过滤的列的名称。 Model.Filter 字典定义为

IDictionary<string,FilterObject>

暂时只使用 FilterObject:

[Serializable]
public class FilterObject
{
    public FilterObject()
    {
        Filter = "";
    }
    public FilterObject(String value)
    {
        Filter = value;
    }
    //[DefaultValue("")]
    public String Filter { get; set; }
}

所以 - 只要使用 Filter 输入的所有键初始化 Model.Filters 字典,它就可以工作,否则我们自然会得到“未找到键”运行时异常。

将列名字符串硬编码到控制器中很难看,感觉应该可以使用 @Html.TextBoxFor(....) 来避免异常,但我找不到有效的语法(或者不只是在无效的索引对象类型等上中断)例如:

Html.TextBoxFor(m=>m.Filters.FirstOrDefault(k=>k.Key=="matchId").Value.Filter)

生成 HTML

  <input id="Value_Filter" name="Value.Filter" type="text" value="" />

这显然没有任何用处

我很确定我只是遗漏了一些东西,但是我发现的所有字典绑定示例都依赖于 Loops 并绑定到一个 int 索引,而此时我很困惑,没有编写一个似乎有点过分的自定义 Helper .

非常感谢任何帮助:-)

【问题讨论】:

  • 在您看来,如果您对字典中的每个键值对进行循环,您应该能够轻松获得所需的结果。您能否更具体地说明绑定的哪个方面不适合您?
  • matchId 是什么?您从哪里获得该值?
  • 我有一个包含 10 列的 iList,其中一列称为“matchId” - 我需要按这些列中的任何一列过滤该列表。因此,我有 10 个(是 10 个)输入框,每个输入框都绑定到上述字典中的一个条目。过滤器输入,如列,具有各种宽度/数据类型,因此迭代创建它们,以及它们的绑定,是有问题的,如果没有其他原因的话。字面上输入的绑定有效。我只需要用 HTML.TextBoxFor 或 HTML.EditorFor 复制它希望有助于澄清:-)

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


【解决方案1】:

哈!我停止了与潮流搏斗,为此写了一个 Helper,比我想象的要容易:

public static MvcHtmlString TextBoxForFilterDictionary(this HtmlHelper helper, IDictionary<string, FilterObject> filters, string fieldName, object htmlAttributes = null)
    {
        FilterObject filter;
        if (!filters.TryGetValue(fieldName, out filter))
        {
            filter = new FilterObject();
        }
        string nameAttribute = String.Format("Model.Filters[{0}].Filter", fieldName);
        MvcHtmlString html = helper.TextBox(nameAttribute, filter.Filter, htmlAttributes);
        return html;
    }

在 HTML 中:

  <%: Html.TextBoxForFilterDictionary(Model.Filters, "matchId")%>
  <!-- a bunch of other formatting HTML -->
  <%: Html.TextBoxForFilterDictionary(Model.Filters, "matchName")%>
  <!-- and so on -->

我的通用 ViewModel 现在包含列表排序、分页和过滤所需的一切,不需要过滤器字典初始化,也看不到弱类型对象。

值得付出一点额外的努力!

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多