Проверка ASP.NET MVC с помощью jQuery $ .ajax - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть ситуация, когда я отправляю данные в контроллер через jQuery $ .ajax, данные представляют собой сериализованную строку json.(MVC 3.0)

Это хорошо связывает - мой контроллер получает результаты, и они верны.Теперь у меня возникла проблема с отправкой обратной проверки.Я подозреваю, что это связано с тем, что не все мои объекты изначально должны формировать элементы управления.

Проблема в том, что мне нужно «добавить» данные в мою модель, используя javascript, потому что для модели требуется элемент из коллекции.Используя javascript, jquery и шаблоны, я выбрал этот элемент и добавляю его в модель, прежде чем он отправит его в контроллер.Однако при обратной передаче эти данные отсутствуют (что ожидается, так как пришлось бы десериализовать их в массив javascript - это не моя проблема).

Моя проблема в том, что онивыполняет двойной постбэк для проверки или вообще ничего.Если я использую e.preventDefault();, чтобы прекратить отправку обычной формы, я никогда не получу подтверждение.Но если я не использую это, то я всегда получаю двойной пост, что, на мой взгляд, никогда не перенаправляет.

Мой код jQuery выглядит следующим образом ..

   $('form').submit(function(e){

    var data = $('form').serializeObject();
    data.Quality = // this line adds some data from a JSON object.

    var json = JSON.stringify(data);

    $.ajax({
      url: location.href,
      type: 'POST',
      dataType: 'json',
      data: json,
      contentType: 'application/json',
      success: function (data) {
       $("#jsonOutput").html(json);
      }
    });

    e.preventDefault();
   });

Вот функция serializeObject.

$.fn.serializeObject = function () {
 var o = {};
 var a = this.serializeArray();
 $.each(a, function () {
  if (o[this.name]) {
   if (!o[this.name].push) {
    o[this.name] = [o[this.name]];
   }
   o[this.name].push(this.value || '');
  } else {
   o[this.name] = this.value || '';
  }
 });
 return o;
};

Вот мое действие контроллера.

  [HttpPost]
  public ActionResult Blueprint(Blueprint blueprint)
  {
   if (ModelState.IsValid)
   {
    using (var context = new Mapping.DataContext())
    {
     context.Blueprints.Add(blueprint);
     context.SaveChanges();

     return Json(Redirect("/List/Blueprints")); 
    }
   }

   return View(blueprint);
  }

Я опубликую больше кода, если потребуется, однако я думаю, что этовсе что актуально.Я использую библиотеку knockoutjs для шаблонов, если это вообще актуально.Пожалуйста, скажите мне, что еще нужно увидеть, если это применимо.

1 Ответ

2 голосов
/ 24 февраля 2011
 $("#jsonOutput").html(json);

Что касается двойной записи, то это происходит потому, что запрос отправляется вашим обработчиком событий и фактической отправкой формы. Чтобы избавиться от этой проблемы, вы хотите что-то вроде этого:

$('form').submit(function(e){

    var data = $('form').serializeObject();
    data.Quality = // this line adds some data from a JSON object.

    var json = JSON.stringify(data);

    $.ajax({
      url: location.href,
      type: 'POST',
      dataType: 'json',
      data: json,
      contentType: 'application/json',
      success: function (data) {
       $("#jsonOutput").html(json);
      }
    });

    return false;
   });

return false сообщит о том, что событие не обрабатывается формой, когда вы сообщаете системе, что уже обработали ее.

Другая проблема, которую я вижу в том, что вы делаете, вы запрашиваете json, устанавливая dataType: 'json' Это означает, что ваш запрос ожидает объект json, и в случае неудачной проверки вы возвращаете полный просмотр , Это, вероятно, не то, что вы хотите делать.

Также Примечание:

$("#jsonOutput").html(json);

При успешном ответе вызывается загрузка значения json, которое вы отправляете с вашим запросом, а не данных из ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...