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

时间:2014-07-29 16:11:45

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

有没有办法检查ASP.Net MVC 5中的particualr字段是否存在验证消息。 我需要以Razaor形式检查这个

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

我需要在验证消息存在时显示div,即对于特定字段的验证失败。

5 个答案:

答案 0 :(得分:31)

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

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

这是一个相当愚蠢的测试,但通常已经足够了,并且在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 *@
    }
    
  5. 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类名称应该可以正常工作。

答案 3 :(得分:1)

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" })

答案 4 :(得分:0)

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