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

时间:2016-02-29 09:43:55

标签: c# asp.net-mvc validation asp.net-mvc-4 razor

我使用共享库中的一些类作为模型类。这就是为什么我无法改变它(添加一些属性或其他任何东西)。但我需要在我的页面上添加验证,我将该类用作@model。 当然我可以通过js验证模型,但我想知道是否有任何方法可以通过标准的microsoft mvc方法在Razor视图中添加验证规则? 我的意思是那样的

@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => (THERE IS MY VALIDATION EXPRESSION), "*", new { @class = "text-danger" })

2 个答案:

答案 0 :(得分:2)

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

从这里,您有两种选择:

  1. 创建一个中间类,然后映射回到程序集中的模型。
  2. 使用像FluentValidation这样的验证库,它允许您创建验证规则,而无需通过灵活且可扩展的流畅API访问模型。例如:
  3. 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的伟大之处。)

答案 1 :(得分:0)

您无法在Razor中执行此操作,但如果您的共享库类是部分的,则可以执行此操作

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(EmployeeSharedValidation))]
public partial class EmployeeShared
{
  private class EmployeeSharedValidation
  {
     [Required]
     public string Name; 
  }
}

这是验证属性如何应用于EntityFramework类,几年前它们基本上是共享类,它不被视为一种好的做法。 正如其中一条评论中提到的那样,您应该使用视图模型,因为该字段将始终对其使用的任何页面进行此验证。 E.g上面代码中的名称字段对于使用EmployeeShared类的任何页面都是必需的,您无法轻易更改它。