C# 检查验证消息是否存在ASP.Net MVC 5

C# 检查验证消息是否存在ASP.Net MVC 5,c#,.net,asp.net-mvc,validation,asp.net-mvc-5,C#,.net,Asp.net Mvc,Validation,Asp.net Mvc 5,是否有方法检查ASP.NETMVC5中的particualr字段是否存在验证消息。 我需要查一下Razaor表格 当前是IsNullOrEmpty,但我认为ValidationMessage确实返回一些html标记,即使没有验证错误 仅当存在验证消息时,我才需要显示div,即对particaulr字段的验证失败。这是@ValidationMessagefor()创建的范围: 字段名是必需的。 您只需检查类“field validation error”是否存在。您可以通过ViewData的属性

是否有方法检查ASP.NETMVC5中的particualr字段是否存在验证消息。 我需要查一下Razaor表格

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


仅当存在验证消息时,我才需要显示div,即对particaulr字段的验证失败。

这是@ValidationMessagefor()创建的范围:

字段名是必需的。

您只需检查类“field validation error”是否存在。

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

 @if(!ViewData.ModelState.IsValid) {
      @Html.ValidationMessageFor(...)
 }
编辑:或者,如果要检查特定属性:

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

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

  • 将Project/Helpers/HtmlHelper.cs创建为新类

    使用System.Web.Mvc;
    使用System.Web.Mvc.Html;
    名称空间项目.Helpers
    {
    公共静态类HtmlHelper
    {
    公共静态bool HasValidationMessageFor(此HtmlHelper HtmlHelper,表达式)
    {
    var value=htmlHelper.ValidationMessageFor(表达式).ToString();
    返回值.Contains(“字段验证错误”);
    }
    }
    }
    
  • 将该命名空间添加到Views/Web.config:

    
    
  • 在Visual Studio中关闭并重新打开解决方案,我必须在VS 2013中关闭该解决方案,否则Intellisense无法在我的Razor视图中获取新的HTML帮助程序

  • 使用它:

    @if (Html.HasValidationMessageFor(model => model.Property))
    {
        @* Do stuff *@
    }
    
  • Kartikeya的回答提供了
    Html.ValidatorMessageFor(…)
    方法调用生成的标记:

    
    字段名是必需的。
    
    (代码格式,我的)

    正如他所说,测试
    字段验证错误
    类名应该可以正常工作。

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

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

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

    我创建了一个
    Html助手
    来检查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;
        }
    }
    
    如何在视图中使用:

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

    我的原始答案:

    最好的方法是什么?@knowledgeseeker据我所知,上述答案最适合您的功能,因为这是ValidationMessageFor()的html将在DOM中呈现,这也是最简单的方法。如果属性键不存在,则您将收到一个
    NullReferenceException
    ,因此在尝试访问
    Errors
    属性之前不要忘记检查null。
    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>