如何在 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" })

如何在 Razor 而不是模型类中设置验证规则

箱即用 ASP.NET MVC 不提供在 Razor 中验证模型的功能。遗憾的是,这是使用属性进行模型验证的问题之一。

从这里您有两种选择:

  1. 创建一个中间类,然后该类映射回程序集中的模型。
  2. 使用像 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 类的任何页面都是必需的,您无法轻松更改它。