2015-10-19 30 views
0

我正在開發一個Asp.Net MVC 5應用程序。在這裏,我必須顯示一個表格,其列數將在運行時生成,即列數不固定。所以,我創建了一個數據表,按照下圖顯示的是對我的看法 -綁定一個動態數據表來查看並獲取HttpPost方法中的數據表

@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(); 
    } 

正如您在查看代碼中看到有一些複選框列。用戶將檢查或取消簽入這些單元格。這個完整的結果我必須發送給控制器。在我的HttpPost方法中,我獲取MyModClass的對象,但其中的數據表空間爲空。 我知道單元格值不綁定到任何控件,因此數據沒有存儲在模型中。每個模型的值應該綁定到一個控件,然後只保留其值。我檢查了很多互聯網上的帖子,將這個數據錶轉換爲一個類,但是所有的帖子都顯示了這種轉換,假設列的數量是已知的。但是,就我而言,數據表的列數是未知的。 如何在我的視圖中顯示此數據表以及如何將修改後的數據表返回給控制器?

+1

是的我不認爲你將能夠將你的表單值綁定到數據表..你可能能夠找到一些代碼,可以將你的formvaluecollection轉換爲數據表,並使用.. ex'cls.dtTable = BuildTableFromFormCollection(Request.Form);' – JamieD77

+0

是否有任何其他方式來顯示數據表?像webgrid或其他東西?在ASP.Net中顯示一個非常容易使用的數據表。 – Harry

回答

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列,然後我將不得不編寫代碼。我確定必須有一個合適的方法來做到這一點,但我無法找到它。

相關問題