代码之家  ›  专栏  ›  技术社区  ›  Vishal

如何使用asp.net mvc数据注释添加用于验证的自定义逻辑?

  •  1
  • Vishal  · 技术社区  · 14 年前

    this 之前关于asp.NETMVC的验证但是没有提到我想做什么,所以有了这个视图模型-

    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应该总是大于结束日期..如何添加这样的自定义逻辑/验证?asp.NETMVC验证能适应这样的情况吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Vishal    14 年前

    这就是我最后所做的我也在检查选择的日期是否不是今天…以防有人想做类似的事情-

    [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; }
        }
    
        2
  •  1
  •   Simon Hazelton    14 年前

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

    简单地看了一下代码,它应该是可行的。

    推荐文章
    Robin  ·  自定义验证代码
    11 年前