Когда вы используете метод jQuery .serialize()
, он генерирует формат строки запроса (т.е. ..&name=value&...
, который необходимо отправить с использованием значения по умолчанию contentType
- т.е. 'application/x-www-form-urlencoded; charset=UTF-8'
.
Удалите contentType: "application/json",
из параметров ajax.
Кроме того, ваша строка кода var token = $('input[name="__RequestVerificationToken"]', this).val();
не требуется - токен включается при использовании .serialize()
$("#form").submit(function (e) {
e.preventDefault();
// Add the following if you have enabled client side validation
if (!$(this).valid()) {
return;
}
var form_data = $(this).serialize();
$.ajax({
url: "@Url.Action("SaveRole")",
method: "POST",
data: form_data,
success: function (result) {
... // see notes below
},
error: function (error) {
console.log(error);
}
});
// return false; not necessary since you have used e.preventDefault()
console.log(form_data);
});
Чтобы вернуть ModelState
ошибки, удалите ValidateAjaxAttribute
- возвращать BadRequest
нецелесообразно (что означает , означающее, что сервер не смог понять запрос из-за неверного синтаксиса ).
Вместо этого измените метод POST, чтобы он возвращал JsonResult
, который включает ошибки (обратите внимание, что нет необходимости возвращать модель)
public ActionResult SaveRole(SaveRolesDetailsViewModel Input)
{
if (ModelState.IsValid)
{
return Json(new { success = true });
}
else
{
var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new { propertyName = k, errorMessage = ModelState[k].Errors[0].ErrorMessage });
return Json(new { success = false, errors = errors });
}
}
Затем в обратном вызове успеха, если есть ошибки, переберите их и найдите соответствующий элемент <span>
, сгенерированный вашим @Html.ValidationMessageFor()
, и обновите его содержимое и имена классов
success: function (result) {
if (result.success) {
return;
}
$.each(result.errors, function(index, item) {
// Get message placeholder
var element = $('[data-valmsg-for="' + item.propertyName + '"]');
// Update message
element.append($('<span></span>').text(item.errorMessage));
// Update class names
element.removeClass('field-validation-valid').addClass('field-validation-error');
$('#' + item.propertyName).removeClass('valid').addClass('input-validation-error');
});
},