Я создал 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);
}
}
Любая помощь приветствуется.