【问题标题】:C# MVC 2 HtmlHelper to generate Table Columns with Model BindingC# MVC 2 HtmlHelper 使用模型绑定生成表列
【发布时间】:2013-07-23 18:08:49
【问题描述】:

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

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

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

【问题讨论】:

  • 也请随时告诉我,这一切都错了。对此没有采取任何行动,所以不确定是因为我没有以可以理解的方式解释它还是它太复杂了

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


【解决方案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 代码进行思考了,所以我不能给你一个真实的例子。

【讨论】:

  • 感谢神秘人,我开始认为我的问题是无形的(或太荒谬)。我考虑过使用 EditorTemplate 路线,但我使用 html 助手的原因是它可以提供更多的灵活性和单点编辑。例如,我将为创建的列/输入分配一些类和数据属性,以与某些客户端 jQuery 绑定。使用 htmlhelper,我可以使用 forloop 动态添加所需的任何其他内容。
  • @BetardFooser - 你太含糊了。我看不出为什么你不能在编辑器模板中添加属性。我也不明白您所说的“单点编辑”是什么意思。如果您的意思是您想要所有动物类型的单个模板,那么通过使用编辑器模板的“附加视图模型数据”字段,这也相对容易完成。它们非常强大,而且非常灵活。
  • @MysteryMan 抱歉,我的意思是动态地基于 for 循环计数器...例如根据计数和/或值添加不同的类或数据属性。
  • @BetardFooser - 那么您所要做的就是将模板的模型类型更改为您的集合类型,您也可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多