1

我之前已经阅读关于 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 验证可以容纳这样的东西吗?

4

2 回答 2

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; }
    }
于 2010-07-13T22:47:08.847 回答
1

我对此不确定,但可能值得查看默认的 asp.net MVC 帐户控制器和 PropertiesMustMatchAttribute 以获取自定义验证的示例。

简要查看代码后,它应该是可行的。

于 2010-07-13T19:45:38.490 回答