2011-05-16 90 views
3

我正在创建一个静音拍卖网站。我的课有一个CurrentBidAmount属性和一个SuggestedBidAmount属性。 SuggestedBidAmount基本上是当前的出价金额加上当前的最低出价增量。 (所以当前的出价是10美元,出价增量是5美元,那么建议的出价是15美元)。当投标人输入新的出价值时,我想验证新值至少与SuggestedBidAmount或更高一样多。MVC3类验证属性

我想在课堂上强制执行此操作。问题是,我不确定验证属性标记是什么,并且似乎无法在Google上找到它们。我必须使用错误的搜索条件,但是,我找不到它们。

[Compare]标记已关闭,但它做了逐字比较。我基本上需要比较一个属性与另一个属性,并验证它是否等于或大于其他属性。

任何人都可以请指出我在正确的方向吗?

回答

2

您可以创建自己的自定义验证属性,只是覆盖其IsValid方法:

[AttributeUsage(AttributeTargets.Class)] 
    public class BidCompareAttribute : ValidationAttribute 
    { 
     public string CurrentBidPropertyName { get; set; } 
     public string MinBidIncrementPropertyName { get; set; } 

     public override bool IsValid(object value) 
     { 
      var properties = TypeDescriptor.GetProperties(value); 
      var minBidIncrement = properties.Find("MinBidIncrement", true).GetValue(value) as IComparable; 
      var currentBid = properties.Find("CurrentBid", true).GetValue(value) as IComparable; 
      return currentBid.CompareTo(minBidIncrement) >= 0; 
     } 
    } 

不是使用这样的:

[BidCompare(CurrentBidPropertyName = "CurrentBid", 
       MinBidIncrementPropertyName = "MinBidIncrement")] 
    public class BidModel 
    { 
     public int CurrentBid { get; set; }  
     public int MinBidIncrement { get; set; } 
    } 
+0

感谢Frennky。我尝试了你刚刚列出的方法,并且我也尝试让模型实现IValidatableObject并重写'public IEnumerable Validate(ValidationContext validationContext)'方法。在这两种情况下,我都有一个奇怪的问题。问题在于,我在Web中的文本字段中键入的值(通过Razor语法'绑定'到CurrentBid属性)并不是要通过测试的值。我正在按PREFOR PRIOR提交。当然,这将永远是错误的价值。有任何想法吗? – 2011-05-16 12:58:33

+0

我不确定在没有更多洞察力的情况下,我可以得到很多帮助。我所能说的是仔细检查将数据绑定到模型的代码。 – frennky 2011-05-16 14:29:47