使用与MVC中的模型连接的jquery在表中添加行

时间:2015-03-13 09:01:03

标签: jquery asp.net-mvc razor

我有这个表并显示来自服务器的值。 如果我想将表中的值发送到服务器

,如何使用jquery在此表中添加新行
<table id="Products" class="Products">
    <tr>
        <th>ProductId</th>
        <th>Productname</th>
        <th>Quantity</th>
        <th>UnitPrice</th>
    </tr>

    @for (int i = 0; i < Model.NorthOrderDetails.Count; i++)
    {
        <tr>
            @Html.HiddenFor(m => m.NorthOrderDetails[i].ProductID)
            @Html.HiddenFor(m => m.NorthOrderDetails[i].ProductName)
            <td>@Html.DisplayFor(m => m.NorthOrderDetails[i].ProductID)</td>

            <td>@Html.DisplayFor(m => m.NorthOrderDetails[i].ProductName)</td>

            <td><input type="hidden" name="NorthOrderDetails.Index" value="@i" /> </td>

            <td> @Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity) </td>

            <td> @Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice, String.Format("{0}", Model.NorthOrderDetails[i].UnitPrice))</td>
            <td>
                <button type="button" class="delete" data-id="@Model.NorthOrderDetails[i].ProductID">Delete</button></td>
        </tr>
    }
</table>    

1 个答案:

答案 0 :(得分:17)

您可以使用BeginCollectionItem html助手为您的模型部分视图生成具有唯一索引器的集合项,并允许在回发时绑定到集合。请注意,您尚未指明属性NorthOrderDetails的类型,但请在之前提出问题,我假设其为NorthOrderDetails.cs

NorthOrderDetails.cs

创建部分内容

Views/YourController/_NorthOrderDetails.cshtml

@model NorthOrderDetailscs
@using(Html.BeginCollectionItem()) 
{
  <tr>
    @Html.HiddenFor(m => m.ProductName)
    <td>@Html.DisplayFor(m => m.ProductID)</td>
    <td>@Html.DisplayFor(m => m.ProductName)</td>
    <td>@Html.TextBoxFor(m => m.Quantity)</td>
    <td>@Html.TextBoxFor(m => m.UnitPrice)</td>
    <td>
      <button type="button" class="delete" data-id="@Model.ProductID">Delete</button>
      @Html.HiddenFor(m => m.ProductID)
      @Html.HiddenFor(m => m.ProductName)
    </td>
  </tr>
}

附注:

  1. 不要包含Index
  2. 的隐藏输入
  3. <input>不是<tr>元素的有效子项(将隐藏的输入放在<td>元素中
  4. String.Format("{0}", Model.NorthOrderDetails[i].UnitPrice 绝对没有(如果你想把它格式化为(比方说)货币,那么 它将是@Html.TextBoxFor(m => m.UnitPrice. "{0:C}")
  5. 您现在可以在主视图中删除for循环,并替换为

    <table id="Products" class="Products">
      <thead>
        <tr>
          <th>ProductId</th>
          <th>Productname</th>
          <th>Quantity</th>
          <th>UnitPrice</th>
        </tr>
      </thead>
      <tbody>
        @foreach(var item in Model.NorthOrderDetails)
        {
          @Html.Partial("_NorthOrderDetails", item)
        }
      </tbody>
    </table>
    

    这会生成一些额外的html(现有项目的索引器为Guid而不是int),但这意味着您只有一个地方可以维护您的代码。

    然后在主视图中,为您添加&#39;添加&#39;按钮

    <button type="button" id="add">Add</button>
    
    <script>
      var tableBody = $('#Products tbody');
      var url = '@Url.Action("Add", "YourControllerName")'; // adjust to suit
      $('#add').click(function() {
        $.get('url, function(response) {
          tableBody.append(response);
        });
      });
    </script>
    

    控制器方法

    public PartialViewResult Add()
    {
      var model = new NorthOrderDetailscs();
      return PartialView("_NorthOrderDetails");
    }
    

    最后,如果您使用客户端验证(jquery-validate-unobtrusive.js)和@Html.ValidationMessageFor()和您的属性,那么每次向DOM添加新元素时都需要重新解析验证器在this answer中解释。