将复选框字段添加到基于数据表的表 MVC 4 Razor

Rim*_*tak 2 c# sql asp.net-mvc razor asp.net-mvc-4

我正在使用带有 Razor 的 MVC 4 Visual Studio 2012。

我正在生成一个基于从远程调用 SQL 服务器拉入数据集的几个表的表。

我希望能够将这些表格输出到网页上,然后在它们旁边创建两列复选框,以便将它们分配到一个或另一个区域(它本质上将数据分为接受和不接受,同时允许一些继续挂起,如果尚未作出决定)。

我目前将数据集中的所有表分配给控制器中的数据表,然后导出到剃刀页面。到目前为止,我还没有为此设置模型,如果我这样做了,我不确定我需要什么。

这是我目前的观点:

@{
    ViewBag.Title = "Requisitions";
}

<table class="table">
<thead>
   <tr>
      @foreach (System.Data.DataColumn col in Model.Columns)
      {
         <th class ="td">@col.Caption</th>
      }
   </tr>
</thead>
<tbody>
@foreach(System.Data.DataRow row in Model.Rows)
{
   <tr>
      @foreach (var cell in row.ItemArray)
      {
         <td class="td">@cell.ToString()</td>
      }
   </tr>
}      
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

这是我当前的控制器:

    DataTable R = new DataTable();

    public void GetData()
    {
        string connString = "Data Source=.;database=dataBase;Integrated Security=SSPI";
        DataSet dataset = new DataSet();
        SqlDataAdapter adapter = new SqlDataAdapter("dbo.procApprovalSelectPending", connString);
        using (adapter)
        {
            adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            adapter.Fill(dataset);
        }
        int count = dataset.Tables.Count;
        for (int i = 0; i < dataset.Tables.Count; i++)
        {
            // Do something for each recordset (11 recordsets)

            if (i == 0)
            {

                R = dataset.Tables[i];

            }
        }
        dataset.Dispose();
        adapter.Dispose();
    }

    public ActionResult Rs()
    {
        GetData();
        return View(R);
    }
Run Code Online (Sandbox Code Playgroud)

我有比显示的更多的数据表,但它们被删除以节省空间。

总而言之,我想要两个复选框列,它们与从数据表创建的每一行对齐,允许我选择那部分数据以将已更改的内容发送回服务器,并创建一个动态复选框对于每一行都给了我一个错误,例如:

@foreach(System.Data.DataRow row in Model.Rows)
{

   <tr>
      @foreach (var cell in row.ItemArray)
      {
         <td class="td">@cell.ToString()</td>
      }
      <td class="td">@Html.CheckBoxFor(m => m.Checkbox)</td>
   </tr>
}   
Run Code Online (Sandbox Code Playgroud)

“表达式树可能不包含动态操作”

提前致谢!

小智 5

您应该创建一个视图模型来表示您想要显示的属性,包括 2 个附加的布尔属性,用于“接受”和“不接受”。假设您的列是 ID 和 Name

public class MyModel
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool Accepted { get; set; }
  public bool NotAccepted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并根据要显示的表中的每一行创建一个集合

public ActionResult Rs()
{
  List<MyModel> items = new List<MyModel>();
  // Populate items from your datatable
  return View(items);
}
Run Code Online (Sandbox Code Playgroud)

那么在你看来

@model List<MyModel>
@using (Html.BeginForm()
{
  <table>
  @for (int i = 0; i < Model.Count; i++)
  {
    <tr>
      <td>@Html.TextBoxFor(m => m[i].ID)</tr>
      <td>@Html.TextBoxFor(m => m[i].Name)</tr>
      <td>@Html.CheckBoxFor(m => m[i].Accepted)</tr>
      <td>@Html.CheckBoxFor(m => m[i].NotAccepted)</tr>
    </tr>
  }
  </table>
  <input type="submit" value="Save" />
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 post 方法中

[HttpPost]
public ActionResult Rs(List<MyModel> model)
{
  foreach(MyModel item in model)
  {
    if(item.Accepted) {.. // do something
    else if (item.NotAccepted) { .. // do something else
    else {.. // do another thing
  }
}
Run Code Online (Sandbox Code Playgroud)