Вопрос

У меня есть ситуация, когда я отправляю данные в контроллер через 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 Для шаблонов, если это совсем актуально. Пожалуйста, скажите мне, что еще нужно увидеть, если применимо.

Это было полезно?

Решение

 $("#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;
   });

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

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

Также обратите внимание:

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

Что называется успешным ответом, загружается стоимость JSON, вы отправляете с вашим запросом, а не в данных от ответа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top