Как добавить пользовательскую логику для проверки с использованием аннотаций данных asp.net mvc?

Я прочитал это раньше о проверках asp.net mvc, но не упоминает, что я хочу сделать, поэтому используйте эту модель представления -

public class MyViewModel
{
        [StringLength(200, MinimumLength = 2, ErrorMessage = "Invalid Name")]
        public string Name { get; set; }
        [Required(ErrorMessage = "*")]
        public DateTime StartDate { get; set; }
        [Required(ErrorMessage = "*")]
        public DateTime EndDate { get; set; }

}

Я настроил проверку, и она работает ... но теперь я хочу добавить условие, например, StartDate всегда должно быть больше, чем End Date ... как я могу добавить такую ​​настраиваемую логику / проверку? Вместо того, чтобы явно проверять его на контроллере и перенаправлять ... может ли проверка asp.net mvc разместить что-то вроде этого?


person Vishal    schedule 13.07.2010    source источник


Ответы (2)


Это то, чем я закончил, я также проверяю, выбрана ли выбранная дата не сегодня ... на случай, если кто-то захочет сделать что-то похожее -

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    public sealed class EndDateValidationAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = "End date cannot be prior to start date";

        public EndDateValidationAttribute(string startDate, string endDate)
            : base(_defaultErrorMessage)
        {
            StartDateStr = startDate;
            EndDateStr = endDate;
            ErrorMessage = _defaultErrorMessage;
        }

        public string StartDateStr { get; private set; }
        public string EndDateStr { get; private set; }

        public DateTime StartDate { get; private set; }
        public DateTime EndDate { get; private set; }

        public override bool IsValid(object value)
        {
            // This is not a required field validator, so if the value equals null return true.  
            if (value == null) return true;

            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
            object startDate = properties.Find(StartDateStr, true /* ignoreCase */).GetValue(value);
            object endDate = properties.Find(EndDateStr, true /* ignoreCase */).GetValue(value);

            StartDate = (DateTime)startDate;
            EndDate = (DateTime)endDate;

            if (StartDate > EndDate) return false;
            else if (Convert.ToDateTime(startDate) == DateTime.Today.Date)
            {
                return false;

            }
            return true;
        }
    } 

Вот как вы можете его использовать -

[EndDateValidationAttribute("StartDate", "EndDate", ErrorMessage = "Start date should be after today's date and before end date!")]
    public class CustomeDate
    {
        [DisplayName("StartDate")]
        [Required(ErrorMessage = "*")]
        public DateTime StartDate { get; set; }
        [DisplayName("EndDate")]
        [Required(ErrorMessage = "*")]
        public DateTime EndDate { get; set; }
    }
person Vishal    schedule 13.07.2010

Я не уверен в этом, но, возможно, стоит взглянуть на контроллер учетной записи MVC asp.net по умолчанию и атрибут PropertiesMustMatchAttribute в качестве примера пользовательской проверки.

Бегло взглянув на код, это должно быть выполнимо.

person Simon Hazelton    schedule 13.07.2010