1

我正在寻找一个 MVC2 自定义 htmlHelper,它允许我在给定数据的情况下动态创建 X 数量的列。

比如说我有一个 Zoo 类,其中包含一个 Animals 列表(它还包含一个子类)。前任:

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 个 for 循环的页面就是一场噩梦。

<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...

也许我做错了,但我认为会有一种简单的方法来输出值得重复的数据列。

任何人都可以提供一种有效的方法吗?

4

1 回答 1

2

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

于 2013-08-02T19:26:25.063 回答