MVC HtmlHelper vs FluentValidation 3.1: Проблемы с получением ModelMetadata IsRequired

Я создал HtmlHelper для Label, который ставит звезду после имени этого Label, если требуется связанное поле:

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, metadata.IsRequired в моем частном LabelHelper будет равно True, и все будет работать, как задумано.

Однако, если я использую FluentValidation 3.1 и добавлю такое простое правило:

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

.. .в моих метаданных LabelHelper.IsRequired будет неправильно установлено в false. (Однако валидатор работает: вы не можете отправить пустое поле, и это должно быть электронное письмо).
Остальные метаданные выглядят правильно (Пример: metadata.DisplayName = "Электронная почта").
Теоретически FluentValidator накладывает атрибут RequiredAttribute на свойство, если используется Rule .NotNull ().

Для справки: Моя модель просмотра:

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

Мой контроллер:

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

Любая помощь приветствуется.

6
задан Dmitry 12 October 2011 в 20:36
поделиться