【问题标题】:Check if Validation Message Exists ASP.Net MVC 5检查验证消息是否存在 ASP.Net MVC 5
【发布时间】:2014-09-21 02:27:49
【问题描述】:

有没有办法检查 ASP.Net MVC 5 中某个特定字段是否存在验证消息。 我需要在 Razor 表单中检查这个

目前是 IsNullOrEmpty 但我认为 ValidationMessage 确实会返回一些 html 标签,即使没有验证错误?

只有当验证消息存在时,我才需要显示一个 div,即对特定字段的验证失败。

【问题讨论】:

    标签: c# .net asp.net-mvc validation asp.net-mvc-5


    【解决方案1】:

    我创建了一个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

    【讨论】:

      【解决方案2】:

      a) 未知或一般自定义添加的错误显示(非模型属性特定)

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

      b) 模型属性特定错误显示

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

      【讨论】:

        【解决方案3】:

        这是一个相当愚蠢的测试,但通常就足够了,并且具有在 Visual Studio 中使用 Intellisense 的额外好处:

        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 没有在我的 Razor 视图中选择新的 HTML 帮助程序时必须这样做

        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 类名应该可以正常工作。

        【讨论】:

          【解决方案4】:

          您可以通过 ViewData 的属性访问 ModelState,以便在输出任何 HTML 之前检查验证错误:

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

          编辑:或者,如果您想检查特定属性:

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

          【讨论】:

          • 如果属性键不存在,那么您将收到一个NullReferenceException,因此在尝试访问Errors 属性之前不要忘记检查是否为空。
          【解决方案5】:

          这是@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”是否存在。

          【讨论】:

          • 最好的方法是什么?
          • @knowledgeseeker 据我所知,上述答案最适合您的功能,因为这是 ValidationMessageFor() 将在 DOM 中呈现的 html,这也是最简单的方法..
          猜你喜欢
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-14
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多