Атрибуты проверки класса MVC3

#asp.net-mvc #asp.net-mvc-3

#asp.net-mvc #asp.net-mvc-3

Вопрос:

Я создаю сайт для автоматического аукциона. Мой класс имеет свойство CurrentBidAmount и свойство SuggestedBidAmount. Предложенное значение Bidamount — это, по сути, текущая сумма ставки плюс текущее минимальное приращение ставки. (Таким образом, текущая ставка составляет 10 долларов, а увеличение ставки составляет 5 долларов, тогда предлагаемая ставка составляет 15 долларов). Когда участник торгов вводит новое значение ставки, я хочу подтвердить, что новое значение, по крайней мере, такое же, как предложенное значение bidamount или больше.

Я хочу применить это на уровне класса. Проблема в том, что я не уверен в том, что такое теги атрибутов проверки, и, похоже, не могу найти их в Google. Должно быть, я использую неправильные условия поиска, тем не менее, я не могу их найти.

Тег [Compare] близок, но это дословное сравнение. Мне в основном нужно сравнить одно свойство с другим и убедиться, что оно равно или больше другого свойства.

Кто-нибудь, пожалуйста, может указать мне правильное направление?

Ответ №1:

Вы можете создать свой собственный атрибут проверки и просто переопределить его 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; }
    }
  

Комментарии:

1. Спасибо, Фрэнки. Я попробовал метод, который вы только что перечислили, и я также попробовал, чтобы модель реализовала IValidatableObject и переопределила метод ‘public IEnumerable<ValidationResult> Validate(ValidationContext ValidationContext)’. В обоих случаях у меня возникает странная проблема. Проблема в том, что значение, которое я ввел в текстовое поле в Web (которое «привязано» к свойству CurrentBid с помощью синтаксиса Razor), не является значением, которое передается для тестирования. Я получаю значение до нажатия кнопки отправки. Которое, конечно, всегда будет неправильным значением. Есть идеи?

2. Я не уверен, что смогу сильно помочь без более глубокого понимания вашего кода. Все, что я могу сказать, это перепроверить код, который привязывает данные к модели.