C# 检查特定表单字段是否有效
我已经搜索了一段时间,还没有找到解决方案 我是一名ASP.NET和MVC4/Razor2新手,所以我主要编辑默认项目 无论如何,我的问题是我正在使用Twitter引导,如果underlaying字段无效,我需要在C# 检查特定表单字段是否有效,c#,asp.net-mvc,razor,validation,C#,Asp.net Mvc,Razor,Validation,我已经搜索了一段时间,还没有找到解决方案 我是一名ASP.NET和MVC4/Razor2新手,所以我主要编辑默认项目 无论如何,我的问题是我正在使用Twitter引导,如果underlaying字段无效,我需要在div上添加一个errorCSS类 到目前为止,我有: <div class="control-group error"> @Html.LabelFor(m => m.Password, new { @class = "control-label"
div
上添加一个error
CSS类
到目前为止,我有:
<div class="control-group error">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
<div class="controls">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password, null, new { @class = "inline-help error" })
</div>
</div>
像这样:
public static class HtmlHelperExtensions
{
public static MvcHtmlString AddClassIfPropertyInError<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
string errorClassName)
{
var expressionText = ExpressionHelper.GetExpressionText(expression);
var fullHtmlFieldName = htmlHelper.ViewContext.ViewData
.TemplateInfo.GetFullHtmlFieldName(expressionText);
var state = htmlHelper.ViewData.ModelState[fullHtmlFieldName];
if (state == null)
{
return MvcHtmlString.Empty;
}
if (state.Errors.Count == 0)
{
return MvcHtmlString.Empty;
}
return new MvcHtmlString(errorClassName);
}
}
公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString addClassifipPropertyInError(
这个HtmlHelper HtmlHelper,
表情表情,
字符串errorClassName)
{
var expressionText=ExpressionHelper.GetExpressionText(表达式);
var fullHtmlFieldName=htmlHelper.ViewContext.ViewData
.TemplateInfo.GetFullHtmlFieldName(expressionText);
var state=htmlHelper.ViewData.ModelState[fullHtmlFieldName];
if(state==null)
{
返回MvcHtmlString.Empty;
}
如果(state.Errors.Count==0)
{
返回MvcHtmlString.Empty;
}
返回新的MvcHtmlString(errorClassName);
}
}
那么在你看来,
<div class="control-group @Html.AddClassIfPropertyInError(x => x.Email, "error")">
<label class="control-label">Email</label>
<div class="controls">
<input type="text" placeholder="Email" name="Email" />
<span class="help-inline">@Html.ValidationMessageFor(x => x.Email)</span>
</div>
</div>
电子邮件
@Html.ValidationMessageFor(x=>x.Email)
除了Loki所说的,我还找到了一个不错的、整洁的解决方案,可以使用ModelState类并检索特定信息来实现我想要的每个验证逻辑:
假设您希望检查模型中名为“InnerClass”和字段“Name”的类的验证:
除上述条件外,您还可以使用以下条件:
ModelState.IsValidField("InnerClass.Name")
ModelState类有很好的方法来检索验证信息,所以通过使用上面提到的方法,您可以通过一些变通方法从中获得更多信息
希望它能帮助你 您也可以检查一下是否有验证消息,快速而肮脏
<div class="control-group @(Html.ValidationMessageFor(m => m.Password) != null ? "error" : "")">
您需要在视图的
ViewData
属性中查询ModelStateDictionary
的IsValidField
方法
对于不属于层次结构的模型,更新中的答案将起作用
对于作为层次结构一部分的模型,需要指定与整个模型相关的字段名
要获取模型属性的字段名,请使用Html.NameFor(…)
API
ViewData.ModelState.IsValidField( Html.NameFor(m => m.Password).ToString() )
让我们更进一步,用一个实用方法扩展HtmlHelper
,该实用方法将在字段无效时输出文本
namespace System.Web.Mvc.Html
{
公共静态类泛型
{
公共静态MvcHtmlString TextForInvalidField(此HtmlHelper HtmlHelper,表达式,字符串文本)
{
if(htmlHelper.ViewData.ModelState.IsValidField(htmlHelper.NameFor(expression.ToString()))
{
返回MvcHtmlString.Empty;
}
返回MvcHtmlString.Create(文本);
}
}
}
最终结果(来自原始示例)如下所示:
<div class="control-group @Html.TextForInvalidField(m => m.Password, "error")">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
<div class="controls">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password, null, new { @class = "inline-help error" })
</div>
</div>
@LabelFor(m=>m.Password,新的{@class=“control label”})
@Html.PasswordFor(m=>m.Password)
@Html.ValidationMessageFor(m=>m.Password,null,新的{@class=“inline help error”})
我很久以前问过这个问题,这是一个小项目,从那时起我就开始了。您的解决方案看起来不错,我只是现在没有时间测试它,我可能最终会这样做。谢谢,尽管我只使用了htmlHelper.ViewContext.ViewData.ModelState.IsValidField(expressionText)我喜欢这个,还有if/else选项,如果可以的话!这就是关键:您需要在ModelState.IsValidField(…)
调用中引用正确的className.fieldName
,否则无论验证状态如何,它每次都将返回true
。
ViewData.ModelState.IsValidField( Html.NameFor(m => m.Password).ToString() )
namespace System.Web.Mvc.Html
{
public static class GeneralExtensions
{
public static MvcHtmlString TextForInvalidField<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string text)
{
if(htmlHelper.ViewData.ModelState.IsValidField(htmlHelper.NameFor(expression).ToString()))
{
return MvcHtmlString.Empty;
}
return MvcHtmlString.Create(text);
}
}
}
<div class="control-group @Html.TextForInvalidField(m => m.Password, "error")">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
<div class="controls">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password, null, new { @class = "inline-help error" })
</div>
</div>