Ошибки состояния модели, не отображаемые в форме partialview

#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)
}