ASP.net MVC4验证模型中的下拉元素?

时间:2013-03-04 19:59:57

标签: validation asp.net-mvc-4 entity-framework-5

如何验证分配给下拉列表元素的值?通常我会在模型中分配范围,并且该字段将被验证。但是,如果我有这样的东西,我不知道如何处理它。

模型

public class Product
{
   public int Id { get; set; }
   public string Name { get; set; }
   public decimal Value { get; set; }
   public DateTime Given { get; set; }
   public TimeSpan TimeGiven { get; set; }
   public string Phase { get; set; }
   public bool Active { get; set; }
   public int PersonId { get; set; }
}

模型中的名称是不同产品的下拉列表。我不确定如何处理Value的验证,因为不同的产品将具有不同的范围。例如,产品名称X的有效范围为25-30,其中产品Y的有效范围为.01 - .5。人员可以分配许多产品,因此我与人员和产品建立了一对多的关系。

有没有办法根据他们选择X,Y的产品来验证价值?我将有大约40种不同的产品,所以理想情况下,我可以做到这一点,而无需为每种产品单独设计模型。

1 个答案:

答案 0 :(得分:1)

您可以使用ValidationAttribute

的自定义业务规则进行验证

您只需要执行以下操作即可:

  1. 创建一个继承自ValidationAttribute的类并覆盖IsValid方法。
  2. 使用您刚创建的属性装饰您的媒体资源。
  3. 例如:

    [AttributeUsage(AttributeTargets.Property, AllowMultiple =false, Inherited = false)]
    public class MyBusinessRuleValidation: ValidationAttribute
    {
      protected override ValidationResult IsValid(object v, ValidationContext validationContext)
      {        
        var Name = (string)v //since we decorated the property Name with this attribute;
        //retrieve Value's value using validationContext
        var value = (decimal) validationContext.ObjectType.GetProperty("Value").GetValue(validationContext.ObjectInstance, null);
    
        //check whether you need to exit with error
        if( name == ProductX) { 
          if(value > 10 && value < 25) 
            return new ValidationResult(ErrorMessage);
    
        }          
    
        return ValidationResult.Success;
      }
    }
    

    使用验证器:

    public class Product
    {
       public int Id { get; set; }
       [MyBusinessRuleValidation(ErrorMessage="Some ugly error")]      
       public string Name { get; set; }
       ....
    }