Asp.net mvc ASP.NETMVC-编辑集合-迭代FormCollection是最好的方法吗?

Asp.net mvc ASP.NETMVC-编辑集合-迭代FormCollection是最好的方法吗?,asp.net-mvc,Asp.net Mvc,问了同样的问题,给出了可行的答案,但随着ASP.NETMVC框架的最终确定,我想知道是否有更好的解决方案 如果我有下面的类结构,那么如何创建视图页面,更重要的是如何将数据返回给控制器 public class Person { public int Id {get;set;} public string Name {get;set;} public IList<TelNos> TelNos {get;set;} } public class TelNos{ publ

问了同样的问题,给出了可行的答案,但随着ASP.NETMVC框架的最终确定,我想知道是否有更好的解决方案

如果我有下面的类结构,那么如何创建视图页面,更重要的是如何将数据返回给控制器

public class Person {


public int Id {get;set;}
  public string Name {get;set;}
  public IList<TelNos> TelNos {get;set;}
}

public class TelNos{
  public string Type {get;set;}
  public string Number {get;set;}
}
然而,这是现在最好的方法,还是MVC的进一步更新提供了更好的解决方案


谢谢,Richard(据我所知),目前还没有任何更新或最佳实践来处理post上的动态表单。仍然行之有效的方法是对信息进行数据绑定,或者在FormCollection中对其进行迭代。如果您看一下,它可能会帮助您进行数据绑定。或者,在后一种情况下,您可以遍历表单集合,用字符串名调用各种值。虽然这可能会有一些冲突,因为它们都将具有相同的id

 "telNo.Type"
 "telNo.Number"
你可能需要做一些操作才能让它像这样

 "telNo.Type[i]"
 "telNo.Number[i]"
其中i是列表中该对象的顺序数字。您还可以使用其他字符串组合为该对象生成唯一id,以便获取类型和编号

 "object[i].telNo.Type" 
 "object[i].telNo.Number"

这实际上取决于您认为如何最好地实现它。有时,让数据绑定用于动态表单可能是一件痛苦的事情,只需遍历集合,然后使用LINQ之类的工具来获取所需的数据/对其进行分组等,就更容易了。

谢谢您的回答。你的回答确实给了我一个想法,我认为这与你的建议不同

如果在视图中包含对象的索引,则默认模型生成器将获取值并将其指定给关联对象。查看代码如下:

    <% int i=0;
foreach (var telNo in Model.Product.TelNos)
                   {%>
                <p><label for="telNo.Type">Type of Number</label>

                    <%= Html.TextBox("telNo"+i.ToString()+".Type")%>
                    <%= Html.ValidationMessage("telNo"+i.ToString()+".Type", "*")%>
                </p>
    <p><label for="telNo.Number">Type of Number</label>

                    <%= Html.TextBox("telNo"+i.ToString()+".Number")%>
                    <%= Html.ValidationMessage("telNo"+i.ToString()+".Number", "*")%>
                </p>
                <%i++;
} %>

号码类型

号码类型

Richard

我喜欢这样一个想法,即链接到

我认为这样比较好有两个原因:

  • 检查FormCollection违反了将视图与控制器分离的想法。控制器对数据的显示方式了解太多
  • 编写单元测试将是痛苦的。您需要手动将所有值粘贴到表单控制器中
  •  "object[i].telNo.Type" 
     "object[i].telNo.Number"
    
        <% int i=0;
    foreach (var telNo in Model.Product.TelNos)
                       {%>
                    <p><label for="telNo.Type">Type of Number</label>
    
                        <%= Html.TextBox("telNo"+i.ToString()+".Type")%>
                        <%= Html.ValidationMessage("telNo"+i.ToString()+".Type", "*")%>
                    </p>
        <p><label for="telNo.Number">Type of Number</label>
    
                        <%= Html.TextBox("telNo"+i.ToString()+".Number")%>
                        <%= Html.ValidationMessage("telNo"+i.ToString()+".Number", "*")%>
                    </p>
                    <%i++;
    } %>