我有两个视图在每个视图上呈现一个表。大多数表都在两个视图之间共享,因此我希望能够为它们重用视图代码。
表1
Column A | Column B
1 | 2
4 | 8
表2
Column A | Column B | Column C
1 | 2 | 7
4 | 8 | 2
显然,我的实际表比上面的例子复杂得多,这只会使问题复杂化。由于表格是用HTML编写的,因此我似乎没有很好的方法可以删除我想要重用的东西,同时仍然可以添加它。
使用表格,我可以使用任何方法来重用代码,还是我不得不放弃使用表格?
答案 0 :(得分:4)
为什么不在给定包含所有列和行信息的特定模型的情况下创建专门构建表的视图?这样,您可以在任何地方使用视图,并且您提供的模型将确定有多少列和行。
我认为你不太了解我的观点,所以我会使用一些代码。现在你可能有一个看起来像这样的模型:
public class Something
{
public string ValueA {get;set;}
public string ValueB {get;set;}
public string ValueC {get;set;}
}
您的观点可能看起来像这样:
<table><tr><th>Column A</th><th>Column B</th><th>Column C</th></tr>
<%foreach(var something in Model.Somethings) {%>
<tr>
<td><%:something.ValueA%></td>
<td><%:something.ValueB%></td>
<td><%:something.ValueA%></td>
</tr>
<%}%>
</table>
嗯,正如您已经注意到的那样,这不仅仅适用于表格中的列。一种解决方案是在模块上设置一些选项以确定包含哪些列,然后在视图中抛出一堆if/then
语句。但我认为更好的解决方案是创建一个看起来更像这样的新Model类:
public class TableModel
{
public IEnumerable<string> Headers {get;set;}
public IEnumerable<IEnumerable<string>> Rows {get;set;}
}
然后你的模型看起来更像这样:
<table><tr>
<%foreach(var header in Model.Headers) {%>
<th><%:header%></th>
<%}%></tr>
<%foreach(var row in Model.Rows) {%>
<tr>
<%foreach(var cell in row) {%>
<td><%:cell%></td>
<%}%>
</tr>
<%}%>
</table>
正如您所看到的,此视图代码中没有任何内容将其自身与原始数据类型明确联系,因此可以将其重用于要在整个应用程序中创建的任何表。您的控制器负责根据您要表示的数据创建TableModel对象。如果特定列包含在该模型中,则会显示该列。如果没有,它就不会。
显然,就像你的例子,这是非常简化的,但它应该给你一般的想法。 DataTable
类已经是.NET的一部分,可能已经拥有了您需要的所有内容,因此您甚至不必创建自己的TableModel
类。它已经在添加和删除列,行等方面获得了一些很好的功能。
答案 1 :(得分:0)
我建议为公共代码创建一个HTMLHelper。我会将条件传递给帮助程序以确定要输出的内容。
答案 2 :(得分:0)
尝试分两步考虑问题。一个是生成标题并抓取您需要的列,另一个实际上是渲染Html。然后你可以调用像
这样的方法RenderTable( string[] columnsINeed )
这将呈现您需要的表格列。
呈现HTML所需的方式不应妨碍您编写可重复使用的代码。