与“模型绑定到列表”相反

时间:2009-01-20 05:37:00

标签: asp.net-mvc

我想知道人们对与Phil Haack's Model Binding To A List相反的最佳方法的想法。我有一个表单,其中包含几个单独的字段以及使用JQuery动态创建的表单字段。这意味着当我在数据库中查询要编辑的内容时,它将返回一个对象,该对象本身将附加n个对象(每个对象)。

我想知道人们会建议什么是创建表单“动态”部分的最佳方式,特别是确保为下拉列表选择正确的项目。我有一个模糊的想法,它将涉及查看用户控件,但我正在努力如何将它们放在一起。

表格:

<form action="/MyItems/Edit" method="post">
   Title: <input type="text" name="Title" value="" /><br />
   Description <input type="text" name="Description" value="" /><br /><br />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <select id="item[0].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[0].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <select id="item[1].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[1].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>

   <input type="hidden" name="myItem.Index" value="2" />
   <input id="item[2].Amount" name="item[2].Amount" type="text" value="" />
   <select id="item[2].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[2].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
</form>

从隐藏输入到第二个选择列表末尾的所有内容都可以重复n次。从数据库查询中提取水合的DTO如下所示:

public class MyItem
{
    public string Name { get; set; }
    public string Description { get; set; }
    public IEnumerable<SelectItem> SelectItems { get; set; }
}

然后每个SelectItem看起来像:

public class SelectItem
{
    public int SelectA { get; set; }
    public int SelectA { get; set; }
}

我希望我已经解释过这个,请提前感谢任何花时间看这个的人。

2 个答案:

答案 0 :(得分:1)

在UserControl或你自己的HtmlHelper扩展方法中包装它会整理视图,但基本上你想要这样的东西:

<%  int idx = 0;
    foreach (SelectItem item in myItem.SelectItems) { %>
<input type="hidden" name="myItem.Index" value="<%= idx %>" />
<input id="item[<%= idx %>].Amount" name="item[<%= idx %>].Amount" type="text" value="" />
<select id="item[<%= idx %>].selectA">
  <option <%= item.selectA == 1 ? "selected" : "" %> value="1">1</option>
  <option <%= item.selectA == 2 ? "selected" : "" %> value="2">2</option>
  <option <%= item.selectA == 3 ? "selected" : "" %> value="3">3</option>
</select>
<select id="item[<%= idx %>].selectB">
  <option <%= item.selectB == 1 ? "selected" : "" %> value="1">1</option>
  <option <%= item.selectB == 2 ? "selected" : "" %> value="2">2</option>
  <option <%= item.selectB == 3 ? "selected" : "" %> value="3">3</option>
</select>
<%  idx++;
    } %>

将它包含在您的form标记中并且它应该渲染得很好,假设您的MyItem实例名为myItem。如果您的值也保存在集合中,则可以将重复的option标记包装在另一个循环中。

答案 1 :(得分:0)

为了完成这个,我最终创建了一个while循环来循环遍历表单项,然后查询我的数据源以保持我的对象。我已经改变了这一点,以便相同的代码现在位于自定义模型绑定器中。非常整洁。