我为标签创建了一个 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],我的私有 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。
供参考:我的 ViewModel:
[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);
}
}
任何帮助表示赞赏。