none
Выражение в конструкторе атрибута RRS feed

  • Вопрос

  • Привет всем!

    Хочу реализовать такое:

    using System;
        using System.ComponentModel.DataAnnotations;
        public class Product
        {
            [Display(Name = "Ид")]
            public int Id { get; set; }
            [Display(Name = "Цена")]
            public double NewPrice { get; set; }
            [Display(Name = "Старая цена")]
            [Range(this.NewPrice + 0.0001, 300)]
            public double OldPrice { get; set; }
            [Display(Name = "Оптовая цена")]
            [Range(0, this.NewPrice - 1)]
            public double WhPrice { get; set; }
            [Display(Name = "Дата вставки")]
            [Range(typeof(DateTime), "1/1/2009", DateTimeNow.ToString())]
            public DateTime AddingDate { get; set; }
        }
    


    Но не получается, так как аргументы атрибута должны быть константами. Нужно, чтобы значение даты не было бы больше текущей, старая цена больше новой и т.д. То есть значение одного поля зависело от значения другого, т.е подставить в аргументы атрибута выражения Как что то подобное можно реализовать?

    23 сентября 2011 г. 10:58
    Модератор

Ответы

  • Решил проблему применив атрибут CustomValidationAtribute

     

    public static class DateValidator
        {
            public static ValidationResult ValidateDate(DateTime date)
            {
                return date < DateTime.Now ? ValidationResult.Success : new ValidationResult("Дата должна быть меньше текущей.");
            }
        }
        public static class ProductValidator
        {
            public static ValidationResult ValidateProduct(Product product)
            {
                return product.OldPrice > product.NewPrice ? ValidationResult.Success : new ValidationResult("Старая цена должна быть больше новой.");
            }
        }
    
    [CustomValidation(typeof(ProductValidator), "ValidateProduct")]
        public class Product
        {
            [Display(Name = "Ид")]
            public int Id { get; set; }
            [Display(Name = "Цена")]
            public double NewPrice { get; set; }
            [Display(Name = "Старая цена")]
            public double OldPrice { get; set; }
            [Display(Name = "Оптовая цена")]
            public double WhPrice { get; set; }
            [Display(Name = "Дата вставки")]
            [CustomValidation(typeof(DateValidator), "ValidateDate")]
            public DateTime AddingDate { get; set; }
        }
    


     И всё нормально. Большое спасибо за ответы !

    • Помечено в качестве ответа YatajgaEditor 24 сентября 2011 г. 5:32
    24 сентября 2011 г. 5:31
    Модератор

Все ответы

  • Стандартными аттрибутами - никак. Аттрибут устанавливается на свойство класса, а не на свойство определенного объекта. Экземляр аттрибута будет общим для всех объектов Product.

    Если нужно сравнивать значение свойства с Today, или с другим свойством - придется писать свой аттрибут для валидации. Пример для двух дат можно взять на http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc.

    23 сентября 2011 г. 16:44
  • Это плохая идея и хорошо, что C# вам такого не позволит.

    Для валидации экземпляра класса с динамическими данными вам лучше реализовать интерфейс IValidatableObject

    http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.ivalidatableobject.aspx

    23 сентября 2011 г. 20:12
  • Решил проблему применив атрибут CustomValidationAtribute

     

    public static class DateValidator
        {
            public static ValidationResult ValidateDate(DateTime date)
            {
                return date < DateTime.Now ? ValidationResult.Success : new ValidationResult("Дата должна быть меньше текущей.");
            }
        }
        public static class ProductValidator
        {
            public static ValidationResult ValidateProduct(Product product)
            {
                return product.OldPrice > product.NewPrice ? ValidationResult.Success : new ValidationResult("Старая цена должна быть больше новой.");
            }
        }
    
    [CustomValidation(typeof(ProductValidator), "ValidateProduct")]
        public class Product
        {
            [Display(Name = "Ид")]
            public int Id { get; set; }
            [Display(Name = "Цена")]
            public double NewPrice { get; set; }
            [Display(Name = "Старая цена")]
            public double OldPrice { get; set; }
            [Display(Name = "Оптовая цена")]
            public double WhPrice { get; set; }
            [Display(Name = "Дата вставки")]
            [CustomValidation(typeof(DateValidator), "ValidateDate")]
            public DateTime AddingDate { get; set; }
        }
    


     И всё нормально. Большое спасибо за ответы !

    • Помечено в качестве ответа YatajgaEditor 24 сентября 2011 г. 5:32
    24 сентября 2011 г. 5:31
    Модератор