我想知道人们对与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; }
}
我希望我已经解释过这个,请提前感谢任何花时间看这个的人。
答案 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循环来循环遍历表单项,然后查询我的数据源以保持我的对象。我已经改变了这一点,以便相同的代码现在位于自定义模型绑定器中。非常整洁。