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

18

有没有一种方法可以检查ASP.Net MVC 5中特定字段的验证消息是否存在。我需要在Razaor表单中进行检查。

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

如果存在验证消息,即特定字段未通过验证,我需要显示一个div。

5个回答

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

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

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

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

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

1
如果属性键不存在,则会出现NullReferenceException异常,因此在尝试访问Errors属性之前不要忘记检查是否为空。 - Joseph Woodward

5

这是 @ValidationMessagefor() 创建的 span:

<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>

您只需检查"class field-validation-error"是否存在即可。

1
最好的方法是什么? - knowledgeseeker
@knowledgeseeker 根据我的了解,上面的答案最适合您的功能,因为这是ValidationMessageFor()将在DOM中呈现的HTML,这也是最简单的方法。 - Kartikeya Khosla

3

这是一个相当简单的测试,但通常足够使用,并具有在Visual Studio中使用Intellisense的附加优点:

  1. Create Project/Helpers/HtmlHelper.cs as a new class

    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. Add that namespace to Views/Web.config:

    <configuration>
      <system.web.webPages.razor>
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="Project.Helpers" />
    
  3. Close and reopen the solution in Visual Studio, which I had to to for VS 2013 or Intellisense didn't pick up the new HTML helper in my Razor views

  4. Use it:

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

卡蒂凯的答案提供了由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”类名应该没有问题。


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

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://dev59.com/-HRB5IYBdhLWcg3wSVYI#2916344
        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://dev59.com/CnXYa4cB1Zd3GeqP-9zu#45329194


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接