it-roy-ru.com

Проверьте, существует ли сообщение проверки ASP.Net MVC 5

Есть ли способ проверить, существует ли сообщение проверки для конкретного поля в ASP.Net MVC 5 . Мне нужно проверить это в форме Razaor

В настоящее время IsNullOrEmpty, но я думаю, что ValidationMessage возвращает некоторые HTML-теги, даже если нет ошибок проверки?

Мне нужно показывать div, только если существует сообщение проверки, т. Е. Проверка не удалась для конкретного поля.

10
knowledgeseeker

Вы можете получить доступ к ModelState через свойство ViewData, чтобы проверить наличие ошибок проверки перед выводом любого HTML:

 @if(!ViewData.ModelState.IsValid) {
      @Html.ValidationMessageFor(...)
 }

Правка: или, если вы хотите проверить определенное свойство:

 @if(ViewData.ModelState["PropertyName"] != null && ViewData.ModelState["PropertyName"].Errors.Any()) {
       @Html.ValidationMessageFor(...)
  }
29
Ben Griffiths

Это промежуток, созданный @ValidationMessagefor ():

<span class="field-validation-error" data-valmsg-for="FieldName" data-valmsg-replace="true"><span for="FieldName" generated="true" class="">Field name is required.</span></span>

Вы можете просто проверить класс "field-validation-error", существует он или нет.

4
Kartikeya Khosla

а) отображение неизвестной или общей пользовательской ошибки (не зависит от свойства модели)

  if (ViewData.ModelState.Any(x => x.Key == string.Empty))
  {
      @Html.ValidationSummary(true, string.Empty, new { @class = "error")
  }

б) отображение специфической ошибки свойства модели

@Html.ValidationMessageFor(m => m.Email, string.Empty, new { @class = "error" })
1
Mark Macneil Bikeio

Это довольно тупой тест, но обычно его достаточно, и он дает дополнительное преимущество использования Intellisense в Visual Studio:

  1. Создать Project/Helpers/HtmlHelper.cs как новый класс

    using System.Web.Mvc;
    using System.Web.Mvc.Html;
    
    namespace Project.Helpers
    {
        public static class HtmlHelper
        {
            public static bool HasValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
            {
                var value = htmlHelper.ValidationMessageFor(expression).ToString();
    
                return value.Contains("field-validation-error");
            }
        }
    }
    
  2. Добавьте это пространство имен в Views/Web.config:

    <configuration>
      <system.web.webPages.razor>
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="Project.Helpers" />
    
  3. Закройте и снова откройте решение в Visual Studio, которое мне пришлось сделать для VS 2013, или Intellisense не нашел новый помощник HTML в моих представлениях Razor

  4. Используй это:

    @if (Html.HasValidationMessageFor(model => model.Property))
    {
        @* Do stuff *@
    }
    

Ответ Kartikeya предоставил разметку, сгенерированную вызовом метода Html.ValidatorMessageFor(...):

<span class="field-validation-error" data-valmsg-for="FieldName" data-valmsg-replace="true">
    <span for="FieldName" generated="true" class="">
        Field name is required.
    </span>
</span>

(Форматирование кода, мое)

И, как он сказал, тестирование имени класса field-validation-error должно работать нормально.

1
Greg Burghardt

Я создал Html Helper, чтобы проверить, допустим ли ModelState, и, если в поле есть ошибка, вернуть строку (имя класса). Я мог бы сделать это непосредственно на виде, но мне нравится более чистый вид. Итак, мой класс:

public static class ErrorHelper
{
    private static string GetPropertyName<TModel, TValue>(Expression<Func<TModel, TValue>> expression)
    {
        // Get field name
        // Code from: https://stackoverflow.com/a/2916344/4794469
        MemberExpression body = expression.Body as MemberExpression;
        if (body != null) return body.Member.Name;

        UnaryExpression ubody = expression.Body as UnaryExpression;
        if (ubody != null) body = ubody.Operand as MemberExpression;

        return body?.Member.Name;
    }

    public static MvcHtmlString ReturnOnError<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, string @class)
    {
        var propertyName = GetPropertyName(expression);
        if (propertyName == null)
            return MvcHtmlString.Empty;

        if (htmlHelper.ViewData.ModelState.IsValid || !htmlHelper.ViewData.ModelState.ContainsKey(propertyName))
            return MvcHtmlString.Empty;

        return htmlHelper.ViewData.ModelState[propertyName].Errors.Any()
            ? MvcHtmlString.Create(@class)
            : MvcHtmlString.Empty;
    }
}

Импорт:

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Mvc;

Как использовать в представлении:

<div class="form-group @Html.ReturnOnError(m => m.Name, "has-error")">
    ...
</div>

Мой оригинальный ответ: https://stackoverflow.com/a/45329194/4794469

0
Roberto Correia