【发布时间】:2011-12-05 21:06:51
【问题描述】:
我为标签创建了一个 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。
参考: 我的视图模型:
[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);
}
}
感谢任何帮助。
【问题讨论】:
-
仅限 Jeremy 的评论。我没有写“知道如何询问验证器类的 MVC 的 ModelMetadataProvider 的自定义实现”,主要是因为我不知道如何去做,研究它可能需要很多时间。如果你能提供一个这样的例子,那绝对有帮助!
-
我也不知道。我扩展了 LabelFor 并向其添加类。这不是最好的解决方案,但我没有时间研究如何实现 ModelMetadataProvider。但是如果我这样做,我会在这里写解决方案。
标签: asp.net-mvc-3 html-helper fluentvalidation modelmetadata isrequired