#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. Я не уверен, что смогу сильно помочь без более глубокого понимания вашего кода. Все, что я могу сказать, это перепроверить код, который привязывает данные к модели.