#c# #html #asp.net #asp.net-mvc
#c# #HTML #asp.net #asp.net-mvc
Вопрос:
Относительно новый для ASP.NET и у меня возникают проблемы с проверками внутри partials. На данный момент при отправке даже при моделировании.Значение isValid равно false ошибки не отображаются в форме partialview. Modelstate передает ошибки обратно в родительский вид с контроллера, на который я указал break, чтобы увидеть в ViewData.
Однако я сталкиваюсь с препятствием при передаче ошибок ModelState частичным. Чего мне не хватает для отображения ошибок проверки в моем частичном представлении?
ViewModel:
[Display(Name = "Email")]
[Required(ErrorMessage = "Email is required")]
public string Email { get; set; }
[Display(Name = "Password")]
[Required(ErrorMessage = "Password is required")]
public string Password { get; set; }
Контроллер:
public ActionResult SaveEmail(AccountSettingsVM viewModel)
{
if (ModelState.IsValid)
{
var saveEmail = _service.SaveEmail(viewModel);
if (saveEmail)
{
return Json(new { IsSuccess = true, Message = "Email Successfully Changed" });
}
else
{
return Json(new { IsSuccess = true, Message = "There was an error processing your request." });
}
}
return View("Index", viewModel)
}
Индексный вид:
@model AccountSettingsVM
<div class="tab-content">
<div class="tab-pane">
@Html.Partial("~/Views/Customer/AccountSettings/_EmailSettings.cshtml", Model)
</div>
</div>
Частичный просмотр:
<div class="col-md-5 col-centered">
@using (Html.BeginForm("SaveEmail", "AccountSettings", FormMethod.Post, new { id = "email-form" }))
{
@Html.AntiForgeryToken();
<div class="form-group">
@Html.LabelFor(model => model.Email, new { @class = "control-label" })
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, new { @class = "control-label" })
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
<button id="btnChangeEmail" type="button" class="btn btn-primary btn-block">Save Changes</button>
}
</div>
Скрипты / Ajax:
<script src="~/Content/light/js/jquery.validate.min.js" type="text/javascript"></script>
<script src="~/Content/light/js/jquery.validate.unobtrusive.js" type="text/javascript"></script>
$('#btnChangeEmail').on('click', function (e) {
e.preventDefault();
const url = `/AccountSettings/SaveEmail`
const ajax = $.ajax({
url: url,
type: 'POST',
data: $('#email-form').serialize()
});
ajax.done(response => {
if (response.IncorrectPassword) {
$incorrectPass.show()
} else if (response.IsSuccess) {
$incorrectPass.hide()
$('#emailMdl-title-span').addClass("text-success");
$('#emailMdl-title-span').html("<i class='fa fa-check-circle text-success'></i>amp;nbsp;amp;nbsp;<strong>Success</strong>");
$('#CreateAccountResults').html(`<strong>${response.Message}</strong>`);
$('#resultsModal').modal();
}
})
})
Ответ №1:
В этом случае дело было не в том, что Modelstate терялся для просмотра, я выполнял AJAX-запрос, а не повторно отображал html с ответом, который содержал бы обновленные ошибки. Решение моей проблемы:
Контроллер
return PartialView("~/Views/Customer/AccountSettings/_ChangeEmailForm.cshtml", vm);
AJAX
if (response.IsSuccess) {
} else {
$('#email-form').html(response)
}