Почему ValidationSummary (true) отображает пустую сводку ошибок свойств?
У меня есть небольшая проблема с использованием ValidationSummary(true)
для отображения ошибок на уровне модели. Если ModelState не содержит ошибки модели (т.е. ModelState.AddModelError("", "Error Description")
), но содержит ошибки свойств (добавленные с помощью аннотаций данных), он отображает сводку проверки без информации об ошибке (при просмотре источника). Поэтому мой css отображает пустой красный квадрат:
![enter image description here]()
Если ошибок свойств нет, то не отображается сводка валидации. С ValidationSummary(true)
я ожидал бы, что он будет показывать только ошибки проверки, если есть ошибки модели. Что я неправильно понял?
У меня есть базовый проект:
Контроллер:
public class HomeController : Controller
{
public ViewResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(IndexViewModel model)
{
return View();
}
}
Модель:
public class IndexViewModel
{
[Required]
public string Name { get; set; }
}
Вид:
@model IndexViewModel
@Html.ValidationSummary(true)
@using(@Html.BeginForm())
{
@Html.TextBoxFor(m => m.Name)
<input type="submit" value="submit" />
}
Ответы
Ответ 1
Я думаю, что что-то не так с вспомогательным методом ValidationSummary
. Вы можете легко создать собственный вспомогательный метод, который обертывает встроенный ValidationSummary
.
public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors)
{
var htmlString = htmlHelper.ValidationSummary(excludePropertyErrors);
if (htmlString != null)
{
XElement xEl = XElement.Parse(htmlString.ToHtmlString());
var lis = xEl.Element("ul").Elements("li");
if (lis.Count() == 1 && lis.First().Value == "")
return null;
}
return htmlString;
}
Затем из вашего представления
@Html.CustomValidationSummary(true)
Ответ 2
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any())
{
@Html.ValidationSummary(true, null, new { @class = "ui-state-error" })
}
Это проверяет наличие ошибок модели и отображает сводку, если они есть.
Ответ 3
Проверьте этот вопрос.
Скрыть сводку можно с помощью CSS:
.validation-summary-valid { display:none; }
Кроме того, вы можете поместить сводку проверки перед Html.BeginForm()
.
Ответ 4
Другой способ сделать это - проверить, есть ли какие-либо элементы li, если не просто скрыть валидации-сводки-ошибки
<script type="text/javascript">
$(document).ready(function () {
if ($(".validation-summary-errors li:visible").length === 0) {
$(".validation-summary-errors").hide();
}
});
</script>
Ответ 5
Я знаю, что обходной путь был найден, но у меня была аналогичная проблема с более простым решением.
Является ли ваш итоговый рендеринг валидации классом css " валидация-сводка-действительный" или " валидация-сводка-ошибки"? Первый класс применяется с сводкой проверки, пустой, второй применяется, когда он заполняется.
Я заметил, что разделитель-разделитель отображается, если сводка валидации не содержит ошибок, поэтому проверка на стороне клиента может отображать ее, если какие-либо поля не проверяются.
В таблице стилей MVC по умолчанию "Site.css" они просто подавляют отображение пустой сводки проверки с помощью "display: none";
например .validation-summary-valid {display: none; }
Ответ 6
Другой вариант исправления с классами Bootstrap:
public static class ValidationSummaryExtensions
{
public static MvcHtmlString CleanValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message = null)
{
if(htmlHelper == null) throw new ArgumentNullException("htmlHelper");
MvcHtmlString validationSummary = null;
if (htmlHelper.ViewData.ModelState.ContainsKey(string.Empty))
{
var htmlAttributes = new { @class = "alert alert-danger" };
validationSummary = htmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes);
}
return validationSummary;
}
}
Ответ 7
У меня была эта пустая проблема сводной проверки. Я просто установил для excludePropertyErrors
значение false - и это добавило ошибки в сводку проверки.
@Html.ValidationSummary(false)
Я понимаю, что это не обязательно то, о чем здесь идет речь - хотя это решает проблему с пустой сводкой проверки - и это вариант, если у вас возникла эта проблема.
Ответ 8
@if (ViewContext.ViewData.ModelState.Count > 0)
{
//Ваш контент
}
Будет работать как прелесть.
Ответ 9
ValidationSummary принимает необязательный параметр сообщения. Если вы установите этот параметр, то окно не будет выглядеть глупо.
@Html.ValidationSummary(true, "Sorry, that didn't work. Please check the details submitted and try again.")
![enter image description here]()
Ответ 10
Это скрипты проверки делают это.
Измените следующий файл web.config
<add key="ClientValidationEnabled" value="false" />
Он должен быть false