Jquery script delete all items in form's collection

前端 未结 1 1188
慢半拍i
慢半拍i 2021-01-29 02:54

I have a table:

<% using(Html.BeginForm(\"View2\",\"Order\"))
{  %>  
Pro
相关标签:
1条回答
  • Because you are deleting some rows, but posting back the whole collection in the Save submit action, your indexers are either not starting a zero, or are non consecutive. In the case of deleting the 1st row, the posted values are

    NorthOrderDetails[1].Quantity=SomeValue&NorthOrderDetails[1].UnitPrice=SomeOtherValue
    

    There are no values with NorthOrderDetails[0]... so binding fails and the collection is empty.

    By default, the DefaultModelBinder require collection indexers to start at zero and be non-consecutive. When you delete an item and remove its controls from the DOM, the collection cannot be bound correctly. To make this work you need to add an extra hidden input which the DefaultModelBinder uses to match up collection properties. Change the view code to

    % for(int i=0; i < Model.NorthOrderDetails.Count; i++)
    {%>
      <tr>
        <td><%: Html.DisplayFor(m => m.NorthOrderDetails[i].ProductID) %></td> // Remove the .ToString()
        <td><%: Html.DisplayFor(m => m.NorthOrderDetails[i].ProductName) %></td>
        <td>
          <input type="hidden" name="NorthOrderDetails.Index" value="<%: i %>" /> // add this 
          <%: Html.TextBoxFor(m => m.NorthOrderDetails[i].Quantity) %>
        </td>
        <td><%: Html.TextBoxFor(m => m.NorthOrderDetails[i].UnitPrice) %></td>
        <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>
      <tr>
    <% } %>
    

    Note: I have long forgotten aspx, but the razor code for the hidden input is <input type="hidden" name="NorthOrderDetails.Index" value="@i" /> so you may want to check my syntax.

    Side notes:

    1. Your use of session seems inappropriate here. In the Delete method, you are removing the item. When your finally save the collection, you would need to get the original collection from the database and compare them to determine which items to delete in the database. Instead, you Delete() method should be calling the database to delete the item (refer my answer to your previous question)
    2. Your Add button should not be, a submit and posting to the View2() method.
    0 讨论(0)
提交回复
热议问题