有没有办法检查ASP.Net MVC 5中的particualr字段是否存在验证消息。 我需要以Razaor形式检查这个
目前是IsNullOrEmpty,但我认为即使没有验证错误,ValidationMessage也会返回一些html标签?
我需要在验证消息存在时显示div,即对于特定字段的验证失败。
答案 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还有额外的好处:
将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");
}
}
}
将该命名空间添加到Views / Web.config:
<configuration>
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="Project.Helpers" />
关闭并重新打开Visual Studio中的解决方案,我不得不为VS 2013或Intellisense在我的Razor视图中选择新的HTML帮助
使用它:
@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
类名称应该可以正常工作。
答案 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>