有没有一种方法可以检查ASP.Net MVC 5中特定字段的验证消息是否存在。我需要在Razaor表单中进行检查。
目前是IsNullOrEmpty,但我认为即使没有验证错误,ValidationMessage也会返回一些html标签?
如果存在验证消息,即特定字段未通过验证,我需要显示一个div。
有没有一种方法可以检查ASP.Net MVC 5中特定字段的验证消息是否存在。我需要在Razaor表单中进行检查。
目前是IsNullOrEmpty,但我认为即使没有验证错误,ValidationMessage也会返回一些html标签?
如果存在验证消息,即特定字段未通过验证,我需要显示一个div。
您可以通过 ViewData 的一个属性访问 ModelState,以便在输出任何 HTML 之前检查验证错误:
@if(!ViewData.ModelState.IsValid) {
@Html.ValidationMessageFor(...)
}
编辑:或者,如果您想要检查特定属性:
@if(ViewData.ModelState["PropertyName"] != null && ViewData.ModelState["PropertyName"].Errors.Any()) {
@Html.ValidationMessageFor(...)
}
这是 @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>
这是一个相当简单的测试,但通常足够使用,并具有在Visual Studio中使用Intellisense的附加优点:
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");
}
}
}
Add that namespace to Views/Web.config:
<configuration>
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="Project.Helpers" />
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
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
”类名应该没有问题。
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" })
我创建了一个 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>
NullReferenceException
异常,因此在尝试访问Errors
属性之前不要忘记检查是否为空。 - Joseph Woodward