Asp.net mvc 2 ASP.Net MVC 2-模型绑定和字典<;int,int>;

Asp.net mvc 2 ASP.Net MVC 2-模型绑定和字典<;int,int>;,asp.net-mvc-2,idictionary,model-binding,Asp.net Mvc 2,Idictionary,Model Binding,在我的界面中,我有一个文本框列表,如下所示: 文本框的数量未知,因为每个文本框都与模板关联。 在我的页面中,目标是将一个数字与其中一些模板相关联 下面是一个示例HTML代码: <% // loop on the templates foreach(ITemplate template in templates) { // get the content from the input dictionary int val;

在我的界面中,我有一个文本框列表,如下所示:

文本框的数量未知,因为每个文本框都与模板关联。 在我的页面中,目标是将一个数字与其中一些模板相关联

下面是一个示例HTML代码:

<%  // loop on the templates
    foreach(ITemplate template in templates)
    {
        // get the content from the input dictionary
        int val;
        content.TryGetValue(template.Id, out val);
        // convert it as a string
        string value = ((val > 0) ? val.ToString() : string.Empty);

        // compute the element name/id (for dictionary binding)
        string id = ??????????
        string name = ??????????????
%>
        <label for="<%= name %>"><%= template.Name %></label>
        <input type="text" id="<%= id %>" name="<%= name %>" value="<%= value %>" />
        <br />
<%  }
%>
0)?val.ToString():string.Empty);
//计算元素名称/id(用于字典绑定)
字符串id=??????????
字符串名称=??????????????
%>

在我的控制器中,我希望得到一个IDictionary,其中第一个int是模板ID,另一个是用户给定的计数

以下是我想要的:

public ActionResult Save(int? id, Dictionary<int, int> countByTemplate)
公共操作结果保存(int?id,字典countByTemplate)
我试了很多东西,但都没用。我试图阅读资料来源,但这是一个迷宫,我得到了一个头像,试图获得有关模型绑定的信息

问题:

  • 关于modelbinding是如何工作的,有好的资源吗? 我想要一些详尽的东西,我厌倦了84093043个博客,这些博客讨论了一个特定的例子
  • 我如何构建我的HTML,使用它来获取IDictionary(甚至在控制器的操作中获取IDictionary)

非常感谢您的帮助

有关如何编写用于绑定到数组、词典和其他集合的输入元素的信息,请访问。

好的……多亏了Levi,我才能够找到解决方案。 不是干净的那个,但它能用

HTML应按以下方式编写:

0)?val.ToString():string.Empty);
//计算元素名(用于字典绑定)
string id=“cbts_{0}”.FormatMe(template.id);
string dictKey=“cbts[{0}].Key”.FormatMe(计数器);
string dictValue=“cbts[{0}].Value”.FormatMe(计数器++);
%>

我必须添加一个隐藏字段来存储值。 我引入了一个“假”计数器,只是为了按照ASP.NETMVC的要求循环字典。 因此,当文本框为空时,我得到了一个充满我的值和“0”的字典

出现了另一个问题:
ModelState
被认为无效,因为“需要一个值”。我不希望需要我的值,但是查看modelbinder代码,我没有找到一种方法告诉binder不需要值

因此,我在控制器中欺骗了
ModelState
,消除了所有错误,如下所示:

公共操作结果保存(int?id,字典cbts) { //清除modelstate中的所有错误 foreach(this.ModelState.Values中的var值) value.Errors.Clear(); 嗯……我有效地找到了一个解决方案,但HTML现在有点难看,而且违反直觉(使用索引在非索引集合上循环??)。 每次我都要耍花招,我会用这种绑定让它正常工作

因此,我现在将打开一个新的职位,使字典活页夹更好。 这是:

编辑-多亏了Pavel Chuchuva,才有了更干净的解决方案

在控制器代码中,使用可为null的int作为字典的值。 要添加的代码多一点,但要干净得多

公共操作结果保存(int?id,字典cbts) { //这是我们的最后一本字典 字典cbtsFinal=新字典(); //具有可空值的双余弦上的循环 foreach(cbts.Keys中的var键) { //如果我们有价值 if(cbts[key].HasValue) //然后把它放在最后一本字典里 cbtsFinal.Add(key,cbts[key].Value); }
尝试
公共操作结果保存(int?id,字典cbts)