C# 检查特定表单字段是否有效

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"

我已经搜索了一段时间,还没有找到解决方案

我是一名ASP.NET和MVC4/Razor2新手,所以我主要编辑默认项目

无论如何,我的问题是我正在使用Twitter引导,如果underlaying字段无效,我需要在
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>