Сводка проверки MVC на стороне клиента не отображается, когда модель недействительна
Я использую пакет Nuget MVC Validation под названием MVC Foolproof Validation.
Я использую его в своей модели, чтобы установить для свойства true значение true, если другое свойство модели было пустым. Часть проверки правильности работает, так как ModelState правильно установлен на недопустимое значение, когда поля Id и поле Location оставлены пустыми. Осматривая ошибки в массиве ModelState, я вижу, как он работает.
Моя проблема заключается в том, что на стороне клиента сводная информация о проверке не отображается. Вот как я это настроил. Кто-нибудь может определить мою проблему?
[DisplayName("Image Id")]
public string Id{ get; set; }
[DisplayName("Location Id")]
[RequiredIfEmpty("Id", ErrorMessage = "You must..etc"]
public string LocationId{ get; set; }
На мой взгляд, я настраиваю итоги проверки и вводим следующие данные
<div class="form-horizontal">
<hr/>
@Html.ValidationSummary(true, "", new {@class = "text-danger"})
<div class="form-group">
@Html.LabelFor(model => model.SearchCriteria.Id, htmlAttributes: new {@class = "control-label col-md-2"})
<div class="col-md-10">
@Html.EditorFor(model => model.SearchCriteria.Id, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => model.SearchCriteria.Id, "", new {@class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.SearchCriteria.LocationId, htmlAttributes: new {@class = "control-label col-md-2"})
<div class="col-md-10">
@Html.EditorFor(model => model.SearchCriteria.LocationId, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => model.SearchCriteria.LocationId,"", new {@class = "text-danger"})
</div>
</div>
В своем действии контроллера я проверяю состояние модели. Нужно ли вызывать ModelState.AddModelError(..). Я пробовал это, но, возможно, есть способ, которым мне нужно это назвать.
[HttpPost]
public ActionResult Search(SearchCriteria searchCriteria)
{
var searchViewModel = new SearchViewModel
{
SearchCriteria = searchCriteria
};
if (ModelState.IsValid)
{
...
}
//ModelState.AddModelError("LocationId", "test");
return View(searchViewModel);
}
2 ответа
Моя проблема заключалась в том, что мой призыв к моим действиям осуществлялся через ajax. Я действительно должен был указать, люди, которые помогли здесь, немедленно диагностировали бы проблему. Когда состояние модели было недействительным, я возвращал новое представление (searchViewModel), но мне пришлось обновить его, чтобы вернуть ошибки в json.
[HttpPost]
public ActionResult Search(SearchCriteria searchCriteria)
{
if (ModelState.IsValid)
{
var searchResults = _searchProvider.GetData(searchCriteria);
return Json(new
{
searchResults
}, JsonRequestBehavior.AllowGet);
}
string errorMessages = string.Join(" <br /> ", this.ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage));
return this.Json(new { HasError = true, ErrorMessages = errorMessages });
}
Измените логический параметр (excludePropertyErrors) в вспомогательной строке ValidationSummary на false
:
@Html.ValidationSummary(false, "", new {@class = "text-danger"})
См. https://msdn.microsoft.com/de-de/library/ee839464(v=vs.118).aspx
В моем случае я решил изменить его с "ModelOnly" на "Все":
Из:
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
Кому:
<div asp-validation-summary="All" class="text-danger"></div>