Подтвердить что ты не робот

Почему 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" />
}
4b9b3361

Ответ 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