C#MVC 2 HtmlHelper使用模型绑定生成表列

时间:2013-07-23 18:08:49

标签: c# asp.net-mvc-2 html-helper

我正在使用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...

也许我认为这一切都错了,但我认为有一种简单的方法可以输出可重复列的数据。

任何人都可以通过有效的方式帮助解决这个问题吗?

1 个答案:

答案 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代码中思考了,所以我不能给你一个真实的例子。