C# 检查验证消息是否存在ASP.Net MVC 5
是否有方法检查ASP.NETMVC5中的particualr字段是否存在验证消息。 我需要查一下Razaor表格 当前是IsNullOrEmpty,但我认为ValidationMessage确实返回一些html标记,即使没有验证错误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的属性
仅当存在验证消息时,我才需要显示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还有额外的好处:
使用System.Web.Mvc;
使用System.Web.Mvc.Html;
名称空间项目.Helpers
{
公共静态类HtmlHelper
{
公共静态bool HasValidationMessageFor(此HtmlHelper HtmlHelper,表达式)
{
var value=htmlHelper.ValidationMessageFor(表达式).ToString();
返回值.Contains(“字段验证错误”);
}
}
}
@if (Html.HasValidationMessageFor(model => model.Property))
{
@* Do stuff *@
}
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>