Asp.net mvc ASP.NET MVC:显示部分表的局部视图

Asp.net mvc ASP.NET MVC:显示部分表的局部视图,asp.net-mvc,partial-views,Asp.net Mvc,Partial Views,我有两个视图,每个视图呈现一个表。大多数表在两个视图之间共享,因此我希望能够为它们重用视图代码 表1 Column A | Column B 1 | 2 4 | 8 表2 Column A | Column B | Column C 1 | 2 | 7 4 | 8 | 2 显然,我的实际表格比上面的例子复杂得多,这只会使问题更加复杂。由于

我有两个视图,每个视图呈现一个表。大多数表在两个视图之间共享,因此我希望能够为它们重用视图代码

表1

Column A   |   Column B
1          |   2
4          |   8
表2

Column A   |   Column B   |   Column C
1          |   2          |   7
4          |   8          |   2
显然,我的实际表格比上面的例子复杂得多,这只会使问题更加复杂。由于表格是如何用HTML编写的,在我看来,似乎没有好的方法可以在保留添加功能的同时删除我想要重用的内容


使用表,我是否可以使用任何方法来重用代码,或者我是否必须放弃使用表?

为什么不创建一个视图,专门针对包含所有列和行信息的特定模型构建表?这样,您可以在任何需要的地方使用视图,并且您为其提供的模型将确定有多少列和行

编辑 我认为您不太理解我的观点,所以我将使用一些代码。现在,您可能有一个类似于以下内容的模型:

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>
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>
你的观点可能是这样的:

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>
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>
那么您的模型看起来更像这样:

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>
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
类。它在添加和删除列、行等方面已经有了一些很好的功能。

我建议为公共代码创建一个HTMLHelper。我会将条件传递给助手,以确定要输出的内容。

试着分两步思考这个问题。一个是生成标题并获取所需的列,另一个是实际呈现Html。然后您可以调用如下方法

RenderTable( string[] columnsINeed )
这将呈现所需的表列


呈现HTML所需的方式不应妨碍您编写可重复使用的代码。

我已经这样做了,每个视图都有自己的视图模型,可以用来创建表,但是视图模型中有相当一部分是共享的,而且恰好共享的信息是使用表显示的。我需要复制大约400行的视图代码,以便仅重新创建表的部分位…@ajbeaven视图中的400行:(你在忙什么?我想你需要找人商量一下this@ajbeaven:我认为您不理解我的观点。请参阅我的编辑。但问题:您不认为将视图模型与数据的显示方式联系起来是个坏主意-同样,不建议将选择列表传递给您查看?如果我们不再希望使用ta要显示此数据,我们需要更改viewmodels,然后需要更改应用程序模型映射到它们的方式。@ajbeaven:如果您与纯粹主义者交谈,表应该只用于显示“表格数据”无论如何。如果您显示的数据是表格,那么将其放在表示数据表的视图模型中是有意义的。如果它实际上只是表示您正在显示的对象,那么它可能没有多大意义。如果不知道您正在使用的哪种代码在视图中占用了400行,我就无法解释ally猜测针对您的特定情况的最佳策略。我不理解这个问题。为什么表会阻止您开发可重用的代码?因为您必须使用HTML编写表,您可以通过在每行中写入td来定义列。我不能只“剪切”两列,然后在不同的表中重用它们。