C# 在HttpPost方法中绑定动态datatable以查看和获取datatable

C# 在HttpPost方法中绑定动态datatable以查看和获取datatable,c#,asp.net,asp.net-mvc,datatable,C#,Asp.net,Asp.net Mvc,Datatable,我正在开发一个Asp.NETMVC5应用程序。在这种情况下,我必须显示一个表,该表的列数将在运行时生成,即列数不是固定的。因此,我创建了一个datatable并将其显示在我的视图中,如下所示- @model MyApps.MyModClass @using (Html.BeginForm()) { <table> <thead> <tr> @{ for (int i = 0; i

我正在开发一个Asp.NETMVC5应用程序。在这种情况下,我必须显示一个表,该表的列数将在运行时生成,即列数不是固定的。因此,我创建了一个datatable并将其显示在我的视图中,如下所示-

@model MyApps.MyModClass
@using (Html.BeginForm())

{
<table>
    <thead>
        <tr>
            @{
                for (int i = 0; i < Model.dtTable .Columns.Count; i++)
                {
                    <th>
                        @Html.DisplayFor(item => Model.dtTable.Columns[i].ColumnName)
                </th>
            }
         }
    </tr>
</thead>
<tbody>
    @foreach (System.Data.DataRow row in Model.dtTable.Rows)
    {
        <tr>
            @foreach (System.Data.DataColumn col in Model.dtTable.Columns)
            {
                if (col.DataType == Type.GetType("System.Boolean"))
                {
                    <td>
                        @{
                            bool val = Convert.ToBoolean(@row[col.ColumnName]);
                        }
                        @Html.CheckBox("Vote", val)
                    </td>
                }
                else
                {
                    <td>
                        @row[col.ColumnName]
                    </td>
                }
            }
        </tr>
    }
</tbody>
</table>
    <input type="submit" value="Save Result" />
}
正如您在视图代码中看到的,有一些复选框列。用户将签入或取消签入这些单元格。这个完整的结果我必须发送给控制器。在我的HttpPost方法中,我获取MyModClass的对象,但其中的datatable为null。 我知道单元格值未绑定到任何控件,因此数据未存储在模型中。每个模型的值都应该绑定到一个控件,然后只保留其值。我在互联网上查看了很多帖子,想把这个数据表转换成一个类,但所有帖子都显示了这种转换,假设列数已知。但是,在我的例子中,数据表的列数是未知的。
如何在视图中显示此datatable以及如何将修改后的datatable返回控制器?

我已尽全力设计视图以显示动态生成的列,但我没有得到任何解决方案,因此我认为最大列数为50,并在模型中定义了100个属性(每列2个属性)

public class MyModCls
{
 public bool IsColumn1Visible { get; set; }

 public string Column1Name { get; set; }

 public bool IsColumn2Visible { get; set; }

 public string Column2Name { get; set; }

 .
 .
 .
 .
 .
 public bool IsColumn50Visible { get; set; }

 public string Column50Name { get; set; }
}
在我看来,在设计表格时,我检查的是“是否列1可见”,然后只绘制

 @for (int i = 0; i < Model.ListofModCls.Count; i++)
 {
    if (Model.ListofModCls[i].IsColumn1Visible)
    {
        <td>
            @Html.DisplayFor(d => Model.ListofModCls[i].Column1Name)
            @Html.HiddenFor(d => Model.ListofModCls[i].IsColumn1Visible)
        </td>
    }
.
.
.
.
.
    if (Model.ListofModCls[i].IsColumn50Visible)
    {
        <td>
            @Html.DisplayFor(d => Model.ListofModCls[i].Column50Name)
            @Html.HiddenFor(d => Model.ListofModCls[i].IsColumn50Visible)
        </td>
     }
}
for(int i=0;iModel.ListofModCls[i].Column1Name) @Html.HiddenFor(d=>Model.ListofModCls[i].IsColumn1Visible) } . . . . . if(Model.ListofModCls[i].isColumn50可见) { @DisplayFor(d=>Model.ListofModCls[i].Column50Name) @Html.HiddenFor(d=>Model.ListofModCls[i].IsColumn50Visible) } }
这种方法有很多缺点,比如在将来,如果我需要超过50列,那么我将不得不编写代码。我确信一定有一种合适的方法可以做到这一点,但我找不到。

是的,我认为您无法将表单值绑定到数据表。。您可能会找到一些可以将formvaluecollection转换为datatable的代码,并使用它们。。ex
cls.dtTable=BuildTableFromFormCollection(Request.Form)是否有其他方式在视图中显示数据表?像webgrid还是其他什么?在ASP.Net中显示数据表过去非常容易。
 @for (int i = 0; i < Model.ListofModCls.Count; i++)
 {
    if (Model.ListofModCls[i].IsColumn1Visible)
    {
        <td>
            @Html.DisplayFor(d => Model.ListofModCls[i].Column1Name)
            @Html.HiddenFor(d => Model.ListofModCls[i].IsColumn1Visible)
        </td>
    }
.
.
.
.
.
    if (Model.ListofModCls[i].IsColumn50Visible)
    {
        <td>
            @Html.DisplayFor(d => Model.ListofModCls[i].Column50Name)
            @Html.HiddenFor(d => Model.ListofModCls[i].IsColumn50Visible)
        </td>
     }
}