绑定动态数据表以查看并获取HttpPost方法中的数据表

时间:2015-10-19 18:33:25

标签: c# asp.net asp.net-mvc datatable

我正在开发一个Asp.Net MVC 5应用程序。在这里,我必须显示一个表,其列数将在运行时生成,即列数不固定。所以,我创建了一个数据表并将其显示在我的视图中,如下所示 -

@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" />
}

在我的控制器中,HttpGet和HttpPost方法是 -

    [HttpGet]
    public ActionResult Tally(int id)
    {
        MyModClass cls = new MyModClass ();

        cls.dtTable = cls.BuildTable(id);

        return View(cls);
    }

    [HttpPost]
    public ActionResult Tally(MyModClass cls)
    {
        return View();
    }

正如您在View代码中看到的那样,有一些复选框列。用户将检查或取消检查这些单元格。这个完整的结果我必须发送给控制器。在我的HttpPost方法中,我获取了MyModClass的对象,但其中的数据表为null。 我知道单元格值没有绑定到任何控件,因此数据不会存储在模型中。每个模型的值应绑定到一个控件,然后只保留其值。我在互联网上检查了很多帖子,将这个数据表转换为一个类,但所有帖子都显示了这个转换,假设已知列数。但是,就我而言,数据表的列数是未知的。 如何在我的视图中显示此数据表以及如何将已修改的数据表返回到控制器?

1 个答案:

答案 0 :(得分:0)

我已尽一切努力设计我的视图以显示动态生成的列,但我没有得到任何解决方案,因此我将最大列数视为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; }
}

然后在我设计表格的过程中,我检查IsColumn1Visible然后只绘制

 @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>
     }
}

这种方法有很多缺点,如果我需要超过50列,那么我将不得不编写代码。我确信必须有一个正确的方法来做到这一点,但我无法找到它。