【发布时间】: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