#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. Любые другие мысли будут оценены. Спасибо.