我正在使用MVC2自定义htmlHelper,这将允许我在给定数据的情况下动态创建X列。
比如说我有一个Zoo类,其中包含一个动物列表(也包含一个子类)。例如:
public class Zoo
{
public List<Animals> myAnimals;
}
public class Animals
{
public string year;
public WarmClimate warm;
public class WarmClimate {
public string hippo;
public string zebra;
public string elephant;
etc...
}
}
我想创建一个类似于以下的表。基本上为每个动物列表创建一个列。可能是4列数据,也可能是30列。
| | 2011 | 2012 | 2013 | 2014 |
| hypo | 6 | 1 | 7 | 0 |
| zebra | 1 | 1 | 2 | 1 |
| elephant | 1 | 1 | 3 | 0 |
我现在有这样的事情;这是非常基本的。只需一个for循环遍历列表,抓取定义的属性值。如果我班上有100只动物,那么像这样的100个循环的页面就是一场噩梦。
<tr>
<td>Zebras: </td>
<%
for (int i = 0; i < Model.myAnimals.Count; i++)
{
%>
<td><%= Html.EditorFor(x => x.myAnimals[i].warm.zebra) %></td>
<%
}
%>
</tr>
我想用自定义的htmlhelper替换它,这样我就可以执行以下操作:
<tr>
<td>Zebras: </td>
<%= Html.MyCustHelper( property?? , list??, expression??) %>
</tr>
MyCustHelper将返回相应的html,其中NAME属性已正确填充以进行模型绑定,就像我使用Html.EditorFor()
帮助时一样,例如:
<td><input name="myAnimals[2].warm.zebra" id="myAnimals_2__warm_zebra" type="text" value="1"></td> etc.... etc...
也许我认为这一切都错了,但我认为有一种简单的方法可以输出可重复列的数据。
任何人都可以通过有效的方式帮助解决这个问题吗?
答案 0 :(得分:1)
当EditorTemplate应该做你想做的事情时,我不明白为什么你需要一个自定义助手。您仍然可以使用EditorFor,但使用模板。
基本上,您只需使用EditorFor指定模板名称:
<tr>
<td>Zebras: </td>
<%= Html.EditorFor(x => x.MyAnimals, "Zebras") %>
</tr>
我早就忘记了WebForms的语法,但它会是这样的。创建一个EditorTemplates文件夹,然后创建一个名为Zebras.ascx的文件,并为强类型模型添加适当的WebForms @directives。
<td><%= Html.EditorFor(x => x.warm.zebra) %></td>
编辑器模板会自动遍历集合,因此您不需要索引,它会自动生成正确的命名约定。
在这里阅读5部分系列:
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
不幸的是,我很久以前就停止在WebForms代码中思考了,所以我不能给你一个真实的例子。