C# 在HttpPost方法中绑定动态datatable以查看和获取datatable
我正在开发一个Asp.NETMVC5应用程序。在这种情况下,我必须显示一个表,该表的列数将在运行时生成,即列数不是固定的。因此,我创建了一个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
@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;i这种方法有很多缺点,比如在将来,如果我需要超过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>
}
}