Vavelation ASP.NET MVC с jQuery $ .ajax
-
08-10-2019 - |
Вопрос
У меня есть ситуация, когда я отправляю данные в контроллер через 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, вы отправляете с вашим запросом, а не в данных от ответа.