ViewModel имеет значение null во втором сообщении jQuery Ajax

#c# #jquery #asp.net-mvc #razor

#c# #jquery #asp.net-mvc #razor

Вопрос:

У меня есть страница с формой для каждого «Заказа». Каждый «Заказ» имеет несколько «элементов». Кроме того, каждая форма имеет тег привязки «Отметить как отправленный», который выполняет сообщение jQuery Ajax. Это сообщение отметит «Заказ» как отправленный и вернет идентификатор заказа в представление. При успешном завершении post я удаляю форму, связанную с «заказом», который был только что помечен как отправленный. Все это отлично работает. Вот где начинаются проблемы. Когда я нажимаю «Отметить как отправленный» для второго «Заказа» в списке, ViewModel передается контроллеру как null. Я замечаю, что мой js-код по-прежнему получает идентификатор заказа при нажатии на тег привязки. Любые предложения будут с благодарностью! Я здесь вырываю свои волосы.

Вот мой javascript:

 <script type="text/javascript">
$(function () {
    $(".MarkAsShipped").click(function () {
        var valid = true;
        var orderNumber = $(this).attr("data-id");
        var formID = "#"   orderNumber;

        if (valid) {
            $.ajax({
                url: "/NeedsShipped/MarkAsShipped",
                type: "POST",
                data: $(formID).serialize(),
                success: function (data, textStatus, jqXHR) {
                    // remove the form for this order
                    $(formID).remove();                        
                },
                error: function (jqXHR, textStatus, errorThrown) {

                }
            });
        }
    });
});
  

В каждой форме есть список элементов. Вот часть моего представления, которая создает формы.

  if (@Model.Count() > 1)
 {
 for (int i = 0; i < Model.Count(); i  )
 {
     using (Html.BeginForm(null, null, FormMethod.Post, new { id = @Model[i].OrderID, name = @Model[i].OrderID }))
     {             
  <br />
  <div class="roundedDivVendor">          
      <div id="contactInfo" style="float:left; padding-left:5px; border-right:thin solid black; width:300px;">
          <span style="font-weight:bold;">Order Number: </span>
          @Model[i].OrderID<br />
          <span style="font-weight:bold;">Ship To:</span><br />
          @Model[i].FirstName.ToString()<span> </span>@Model[i].LastName.ToString()            

          <br />
          @Model[i].Address1
          @Html.HiddenFor(m => m[i].OrderID)
         <br /><br />
      </div>
      <div id="itemsToShip" style="padding-left:20px;">
        <span style="font-weight:bold; padding-left:5px;">Items to Ship: </span><span style="padding-left:450px;">
        <a href="#" class="MarkAsShipped" data-id="@Model[i].OrderID">Mark as Shipped</a></span><br />
          @for (int x = 0; x < @Model[i].OrderItems.Count(); x  )
          {                   
              @Html.HiddenFor(m => @Model[i].OrderItems[x].OrderProductsID)
              @Html.CheckBoxFor(m => @Model[i].OrderItems[x].isShipped)
              @Model[i].OrderItems[x].ShortDescription
              <br />                  
          }
      </div>
      <div style="clear:left;"></div>
 </div>
 <br />
     }
 }
  

В контроллере я возвращаю OrderID как Json:

 return Json(order.OrderID, JsonRequestBehavior.AllowGet);
  

Комментарии:

1. Я помогаю вам в отладке. Удалите $(FormID).remove() и попробуйте. Проверьте, получаете ли вы ViewModel и во 2-й раз. Если да, то проблема связана с методом удаления.

2. После успешного завершения первого вызова ajax, прежде чем щелкнуть ссылку удалить во второй раз, перейдите в браузер и просмотрите исходный код. Проверьте, являются ли теги HTML правильными. Может быть вероятность того, что ваш метод удаления повреждает ваш DOM.

3. Спасибо Rockstart. Я прокомментировал «удалить», и он все еще делает то же самое. Как вы думаете, это как-то связано с «сериализацией»?

4. Я также только что обнаружил, что первый порядок в списке является единственным, который работает. Так что я не могу выбрать какой-либо один порядок в списке, и он будет работать с первого раза. Я начинаю думать, что это должно быть что-то в моем HTML. Любые другие мысли будут оценены. Спасибо.