加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?

发布时间:2020-12-16 09:10:08 所属栏目:asp.Net 来源:网络整理
导读:ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Model类型或者字段/属性上应用相应的ValidationAttribute。但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上—

ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Model类型或者字段/属性上应用相应的ValidationAttribute。但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上——即使我们将AllowMultiple属性设置为True。这篇文章的目的就是为了解决这个问题。[源代码从这里下载]

一、一个自定义ValidationAttribute:RangeIfAttribute

为了演示在相同的目标元素(类、属性或者字段)应用多个同类的ValidationAttribute,我定义了一个名称为RangeIfAttribute特性用于进行“有条件的区间验证”。如下面的代码片断所示,RangeIfAttribute是RangeAttribute的子类,应用在上面的AttributeUsageAttribute特性的AllowMultiple 属性被设置为True。RangeIfAttribute定义了Property和Value两个属性,分别表示被验证属性/字段所在类型的另一个属性名称和相应的值,只有当指定的属性值与通过Value属性值相等的情况下我们在真正进行验证。具体的验证逻辑定义在重写的IsValid方法中。

   1: [AttributeUsage( AttributeTargets.Field| AttributeTargets.Property,AllowMultiple = true)]
   3: {
   5:     string Value { get; set; }
   7:         : base(minimum,maximum)
   9:         this.Property = property;
  11:     }
  13:     {
  15:         propertyValue = propertyValue ?? "";
  17:         {
  19:         }
  21:         {
  24:? 
  26:         new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName),memberNames);
  28: }

二、将RangeIfAttribute应用于Employee

我们将RangeIfAttribute特性应在具有如下定义的表示员工的Employee类型的Salary(表示薪水)属性上,另外一个属性Grade表示员工的级别。应用在Salary属性上的RangeIfAttribute特性体现了基于级别的薪水区间验证规则:对于G7、G8和G9的员工,其薪水分别在2000~3000,3000~4000和4000~5000范围内。

   2: {
string Grad { get; set; }
   6:     [RangeIf("G8",3000,4000)]
   8:     decimal Salary { get; set; }
class EmployeeController : Controller
   4:     {
   6:     }
   8:     [HttpPost]
  10:     {
  12:         {
  14:             new Employee());
else
  21:? 
   1: @model MultipleValidator.Models.Employee
   3:     ViewBag.Title = "Employee Management";
   5: @Html.ValidationSummary(true)
   7: { 
   9:     <input type="submit" value="Save" />
//其他成员
override object TypeId
   8:         get
  10:             return (null == typeId) ? (typeId = object()) : typeId;
  12:     }