asp.net-mvc-3 - MVC HtmlHelper 与 FluentValidation 3.1 : Troubles getting ModelMetadata IsRequired

标签 asp.net-mvc-3 html-helper fluentvalidation modelmetadata isrequired

我为标签创建了一个 HtmlHelper,如果需要关联字段,它会在该标签的名称后面放置一个星号:

public static MvcHtmlString LabelForR<TModel, TValue>(
        this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    return LabelHelper(
        html,
        ModelMetadata.FromLambdaExpression(expression, html.ViewData),
        ExpressionHelper.GetExpressionText(expression),
        null);
}

private static MvcHtmlString LabelHelper(HtmlHelper helper, ModelMetadata metadata, string htmlFieldName, string text)
{
    ... //check metadata.IsRequired here
    ... // if Required show the star
}

如果我使用 DataAnnotations 并在 ViewModel 中的属性上单击 [Required],则我的私有(private) LabelHelper 中的metadata.IsRequired 将等于 True,并且一切都会按预期工作。

但是,如果我使用 FluentValidation 3.1 并添加这样的简单规则:

public class CheckEmailViewModelValidator : AbstractValidator<CheckEmailViewModel>
{
    public CheckEmailViewModelValidator()
    {
        RuleFor(m => m.Email)
            .NotNull()
            .EmailAddress();
    }
}

...在我的 LabelHelper 元数据中。IsRequired 将被错误地设置为 false。 (验证器可以工作:您不能提交空字段,并且它需要是类似电子邮件的字段)。
其余元数据看起来正确(例如:metadata.DisplayName =“Email”)。
理论上,如果使用了 Rule .NotNull(),FluentValidator 会在属性上使用RequiredAttribute。

引用资料: 我的 View 模型:

[Validator(typeof(CheckEmailViewModelValidator))]
public class CheckEmailViewModel
{
    //[Required]
    [Display(Name = "Email")]
    public string Email { get; set; }
}

我的 Controller :

public class MemberController : Controller
{
    [HttpGet]
    public ActionResult CheckEmail()
    {
        var model = new CheckEmailViewModel();
        return View(model);
    }
}

感谢任何帮助。

最佳答案

默认情况下,MVC 将 DataAnnotations 属性用于两个不同的目的 - 元数据和验证。

当您在 MVC 应用程序中启用 FluentValidation 时,FluentValidation 会 Hook 到验证基础结构,但不会 Hook 元数据 - MVC 将继续使用元数据的属性。如果您想使用 FluentValidation 进行元数据和验证,那么您需要编写 MVC 的 ModelMetadataProvider 的自定义实现,它知道如何询问验证器类 - 这不是 FluentValidation 开箱即用支持的东西。

关于asp.net-mvc-3 - MVC HtmlHelper 与 FluentValidation 3.1 : Troubles getting ModelMetadata IsRequired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7736236/

相关文章:

asp.net-mvc-3 - 授权属性 MVC 3 和 Web.Config AppSettings 值

asp.net-mvc - ASP.NET MVC Beta 1 - Html.RenderPartial 在哪里?

javascript - 如何设置通过查看 MVC URL 选择的下拉选项

javascript - 单击复选框显示日期选择器

c# - 使用 Entity Framework 从 Id 列表中删除多个项目

asp.net-mvc - 使用MVC3 WebGrid帮助器将连字符添加到html属性名称

c# - 检查参数是否是具有流畅验证的 3 个值之一

asp.net - ASP.NET 中输入验证的最佳实践?

c# - Fluent Validation - 当特定验证失败时停止验证所有其他验证

asp.net-mvc - mvc route actionlink url 使用名称而不是 id