如何在 Razor 而不是模型类中设置验证规则
本文关键字:设置 验证 规则 模型 Razor | 更新日期: 2023-09-27 18:36:44
我使用共享库中的一些类作为模型类。这就是为什么我无法更改它(添加一些属性或任何 alse)。但是我需要在我的页面上添加验证,我将该类用作@model。当然,我可以通过js验证模型,但是我想知道有没有办法通过标准的Microsoft mvc方法在Razor视图中添加验证规则?我的意思是类似的东西
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => (THERE IS MY VALIDATION EXPRESSION), "*", new { @class = "text-danger" })
开
箱即用 ASP.NET MVC 不提供在 Razor 中验证模型的功能。遗憾的是,这是使用属性进行模型验证的问题之一。
从这里您有两种选择:
- 创建一个中间类,然后该类映射回程序集中的模型。
- 使用像 FluentValidation 这样的验证库,它允许您创建验证规则,而无需通过灵活且可扩展的流畅 API 访问模型。例如:
.
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
然后,您可以像这样验证模型:
var validator = new YourModelValidator();
ValidationResult results = validator.Validate(yourModel);
就个人而言,我会选择第二种方法。Fluent Validation 是一个很棒的库,不需要很长时间就可以实现,并且是比 ASP 更好的验证模型的方法。NET当前的实现(在我看来 - 虽然这不是对 ASP.NET 家伙的诽谤,但这就是OSS伟大的原因)。
你不能在 Razor 中做到这一点,但如果你的共享库类是部分的,那么你可以这样做
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(EmployeeSharedValidation))]
public partial class EmployeeShared
{
private class EmployeeSharedValidation
{
[Required]
public string Name;
}
}
这就是验证属性应用于EntityFramework类的方式,这些类在几年前本质上是共享类,它不被认为是一种好的做法。正如在其中一条注释中提到的,您应该使用视图模型,因为该字段将始终对其中使用的任何页面进行此验证。例如,上述代码中的"名称"字段对于使用 EmployeeShared 类的任何页面都是必需的,您无法轻松更改它。