У меня есть простое действие ASP.NET MVC, подобное этому:
public ActionResult Edit(EditPostViewModel data)
{
}
У EditPostViewModel
них есть такие атрибуты проверки:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
В представлении я использую следующих помощников:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Если я сделаю отправку в форме, это текстовое поле будет помещено в проверку, которая будет выполнена сначала на клиенте, а затем на service ( ModelState.IsValid
).
Теперь у меня есть пара вопросов:
Можно ли вместо этого использовать jQuery ajax submit? Я просто удаляю форму, и при нажатии кнопки отправки javascript соберет данные, а затем запустит файл
$.ajax
.Будет ли
ModelState.IsValid
работать серверная часть ?Как я могу передать проблему проверки клиенту и представить ее так, как будто я использую build int validation (
@Html.ValidationSummary(true)
)?
Пример вызова Ajax:
function SendPost(actionPath) {
$.ajax({
url: actionPath,
type: 'POST',
dataType: 'json',
data:
{
Text: $('#EditPostViewModel_Text').val(),
Title: $('#EditPostViewModel_Title').val()
},
success: function (data) {
alert('success');
},
error: function () {
alert('error');
}
});
}
Изменить 1:
Включено на странице:
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
Ответы:
Сторона клиента
Используя
jQuery.validate
библиотеки должно быть довольно простым в настройке.Задайте в файле следующие настройки
Web.config
:Когда вы строите свое представление, вы должны определять такие вещи:
ПРИМЕЧАНИЕ: они должны быть определены в элементе формы.
Затем вам нужно будет включить следующие библиотеки:
Это должно иметь возможность настроить вас для проверки на стороне клиента
Ресурсы
На стороне сервера
ПРИМЕЧАНИЕ. Это только для дополнительной проверки на стороне сервера поверх
jQuery.validation
библиотеки.Возможно, поможет что-то вроде этого:
Где
ValidateAjax
атрибут, определенный как:Это возвращает объект JSON, в котором указаны все ошибки вашей модели.
Пример ответа будет
Это будет возвращено в ваш обратный вызов обработки ошибок
$.ajax
вызоваВы можете просмотреть возвращенные данные в цикле, чтобы установить сообщения об ошибках по мере необходимости на основе возвращенных ключей (я думаю, что что-то вроде
$('input[name="' + err.key + '"]')
найдет ваш элемент вводаисточник
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
Что вам нужно сделать, так это сериализовать данные формы и отправить их в действие контроллера. ASP.NET MVC привяжет данные формы к
EditPostViewModel
объекту (параметр вашего метода действия), используя функцию привязки модели MVC.Вы можете проверить свою форму на стороне клиента и, если все в порядке, отправить данные на сервер.
valid()
Метод пригодится.источник
Вот довольно простое решение:
В контроллере мы возвращаем наши ошибки вот так:
Вот некоторые из клиентских скриптов:
Вот как мы обрабатываем это через ajax:
Кроме того, я визуализирую частичные представления через ajax следующим образом:
RenderRazorViewToString метод:
источник
PartialView
для рендеринга в Ajax?Добавлена дополнительная логика в решение, предоставленное @Andrew Burgess. Вот полное решение:
Создал фильтр действий для получения ошибок для запроса ajax:
Добавил фильтр в мой метод контроллера как:
Добавлен общий скрипт для проверки jquery:
Наконец, добавлен метод javascript с ошибкой в мою форму Ajax Begin:
источник
Сделать это можно так:
( Изменить: учитывая, что вы ждете ответа
json
сdataType: 'json'
).СЕТЬ
JS:
Если вам нужно, я также могу объяснить, как это сделать, вернув ошибку 500, и получить ошибку в ошибке события (ajax). Но в вашем случае это может быть вариант
источник