Tôi tạo ra một HtmlHelper cho Label mà đặt một ngôi sao sau tên của Label rằng nếu lĩnh vực liên quan được yêu cầu:MVC HtmlHelper vs FluentValidation 3.1: Troubles nhận ModelMetadata isRequired
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
}
Nếu tôi sử dụng DataAnnotations và tát [Bắt buộc ] trên thuộc tính trong ViewModel của tôi, metadata.IsRequired trong LabelHelper riêng tư của tôi sẽ bằng True và mọi thứ sẽ hoạt động như dự định.
Tuy nhiên, nếu tôi sử dụng FluentValidation 3.1 và thêm một quy tắc đơn giản như thế:
public class CheckEmailViewModelValidator : AbstractValidator<CheckEmailViewModel>
{
public CheckEmailViewModelValidator()
{
RuleFor(m => m.Email)
.NotNull()
.EmailAddress();
}
}
... trong LabelHelper metadata.IsRequired của tôi sẽ được sai thiết lập là false. (Trình xác nhận hoạt động mặc dù: bạn không thể gửi trường trống và nó cần phải là một Email như thế).
Phần còn lại của siêu dữ liệu có vẻ chính xác (Ví dụ: metadata.DisplayName = "Email").
Về lý thuyết, FluentValidator slaps RequiredAttribute trên thuộc tính nếu Rule .NotNull() được sử dụng.
Đối với tài liệu tham khảo: ViewModel của tôi:
[Validator(typeof(CheckEmailViewModelValidator))]
public class CheckEmailViewModel
{
//[Required]
[Display(Name = "Email")]
public string Email { get; set; }
}
điều khiển của tôi:
public class MemberController : Controller
{
[HttpGet]
public ActionResult CheckEmail()
{
var model = new CheckEmailViewModel();
return View(model);
}
}
Any help is appreciated.
Bạn đã giải quyết vấn đề này chưa? –
Chỉ để mở rộng nhận xét của Jeremy. Tôi đã không viết "thực hiện tùy chỉnh của ModelMetadataProvider của MVC mà biết cách thẩm vấn các lớp trình duyệt tính hợp lệ" về cơ bản vì tôi không biết ngay lập tức làm thế nào để làm điều đó và nghiên cứu nó có lẽ sẽ mất rất nhiều thời gian. Nếu bạn có thể cung cấp một ví dụ về điều này, nó hoàn toàn sẽ giúp bạn! – Dmitry
Tôi cũng không biết.Tôi đã mở rộng LabelFor và thêm lớp vào nó. Nó không phải là giải pháp tốt nhất, nhưng tôi không có thời gian để điều tra cách triển khai ModelMetadataProvider. Nhưng nếu tôi làm điều đó, tôi sẽ viết giải pháp ở đây. –