设置值从集合提交提交mvc

时间:2015-03-04 08:03:35

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

我想进入控制器和模型以及来自集合的特定值,其中我按下按钮

 <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>
        <td><%: Html.Label(Model.NorthOrderDetails[i].ProductID.ToString()) %></td>
        <td><%: Html.Label(Model.NorthOrderDetails[i].ProductName) %> </td>
        <td><%: Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity) %></td>
        <td><%: Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice) %></td>
        <td><%:  @Html.ActionLink("Go to second view", "ViewTwo", "Order", Model, null)%></td>
         <input type="submit" title="ads" value =<%: Model.NorthOrderDetails[i].ProductID.ToString()%> name=ssad /> 
 <tr>
                 <% } %>

</table>

我可以在收藏中设置值,例如

     <input type="submit" title="ads" value =<%: Model.NorthOrderDetails[i].ProductID.ToString()%> name=ssad /> 

此值将等于17,例如在控制器中。这项工作,但我如何将按钮中的文本从集合中的值更改为任何文本?

更新 我使用Stephen Muecke的代码,但我编辑表因为我使用aspx页面

 <td><button type="button" class="delete" data-id="<%:Model.NorthOrderDetails[i].ProductID %>">Delete</button><td> 
    <td><input type="hidden" name="<%:Model.NorthOrderDetails[i].ProductName %>" value="<%:i %>" /><td>

而且,不幸的是脚本没有调用控制器

1 个答案:

答案 0 :(得分:2)

每次要删除项目时,您都可以使用ajax将项目ID值发布到删除数据库中项目的控制器方法,然后从中删除该项目,而不是执行完整发布并重新生成视图。 DOM。这将大大提高性能,这意味着您可以避免使用Session

将视图更改为(抱歉,这是Razor语法)

  @for (int i = 0; i < Model.NorthOrderDetails.Count; i++)
  {
    <tr>
      <td>@Html.LabelFor(Model.NorthOrderDetails[i].ProductID)</td> // ToString not required
      <td>@Html.Label(Model.NorthOrderDetails[i].ProductName)</td>
      <td>@Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity)></td>
      <td>@Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice)</td>
      <td>@Html.ActionLink("Go to second view", "ViewTwo", "Order", Model, null)</td> // This wont work
      <td>
        <button type="button" class="delete" data-id="@Model.NorthOrderDetails[i].ProductID">Delete</button><td> // change this
        <input type="hidden" name="@Model.NorthOrderDetails.Index" value="@i" /> // add this
    </tr>
  }
  </table>
  <input type="submit" value="Save" /> // add this

注意:

  1. 您的操作链接不起作用(您无法将收藏集传递给 GET方法)我怀疑你的意思是@Html.ActionLink("Go to second view", "ViewTwo", "Order", new { ID = Model.NorthOrderDetails[i].ProductID }, null)所以你可以将productID传递给ViewTwo()方法
  2. 将每行中的提交按钮更改为普通按钮,并在末尾添加一个提交按钮(以便在一个帖子中保存对文本框的所有更改)
  3. Index属性添加特殊隐藏输入。这是用的 由DefaultModelBinder匹配的集合 索引器是非连续的(如果删除项目,它们将是 在收集的中间)
  4. 您不会为ProductID呈现任何输入,这意味着您不会 能够在回发后识别产品。你需要添加 隐藏的输入
  5. 然后添加以下脚本

    var url = '@Url.Action("Delete", "YourControllerName")';
    $('.delete').click(function() {
      var id = $(this).data('id'); // Get the product ID
      var row = $(this).closest('tr') // Get the table row
      $.post(url, { ID: id }, function(data) {
        if(data) {
          row.remove(); // remove the row from the table
        } else {
          // oops!
        }
      });
    });
    

    和控制器

    public ActionResult View(IEnumerable<YourModel> model)
    {
      // Save your collection and redirect
    }
    
    [HttpPost]
    public JsonResult Delete(int ID)
    {
      // Delete the product in the database based on the ID
      return Json(true);
    }
    

    注意:如果删除某个项目可能会以某种方式抛出和失败,那么您应该return Json(null);以便可以在ajax方法中检查它。