【问题标题】:How to apply Custom Validation rules to ViewModel attribute in MVC3如何将自定义验证规则应用于 MVC3 中的 ViewModel 属性
【发布时间】:2012-10-29 09:11:57
【问题描述】:

在我的 MVC 应用程序中,我有以下 ViewModel

public class MyViewModel
{
   public int StartYear { get; set; }
   public int? StartMonth { get; set; }
   public int? StartDay { get; set; }

   public int? EndYear { get; set; }
   public int? EndMonth { get; set; }
   public int? EndDay { get; set; }

   [DateStart]
   public DateTime StartDate
   {
       get
       {
           return new DateTime(StartYear, StartMonth ?? 1, StartDay ?? 1);
       }
   }

   [DateEnd(DateStartProperty="StartDate")]
   public DateTime EndDate
   {
       get
       {
           return new DateTime(EndYear ?? DateTime.MaxValue.Year, EndMonth ?? 12, EndDay ?? 31);
       }
   }
 }

我不使用日历助手,因为我需要这种格式的日期(背后有逻辑)。现在我创建了自定义验证规则:

    public sealed class DateStartAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            DateTime dateStart = (DateTime)value;
            return (dateStart > DateTime.Now);
        }
    }

    public sealed class DateEndAttribute : ValidationAttribute
    {
        public string DateStartProperty { get; set; }
        public override bool IsValid(object value)
        {
            // Get Value of the DateStart property
            string dateStartString = HttpContext.Current.Request[DateStartProperty];
            DateTime dateEnd = (DateTime)value;
            DateTime dateStart = DateTime.Parse(dateStartString);

            // Meeting start time must be before the end time
            return dateStart < dateEnd;
        }
    }

问题是DateStartProperty(在本例中为StartDate)不在Request 对象中,因为它是在表单发布到服务器之后计算的。因此dateStartString 始终为空。如何获得StartDate 的值?

【问题讨论】:

    标签: c# asp.net-mvc-3 datetime validation


    【解决方案1】:

    您可以使用反射来获取 this answer 中的其他属性(这对我来说似乎有点 hacky),或者为类创建自定义验证属性,而不是像 here 中讨论的单个属性。

    【讨论】:

      【解决方案2】:

      试试这个插件:http://docs.jquery.com/Plugins/Validation/multiplefields

      希望对你有帮助~

      【讨论】:

      • 谢谢,但我正在寻找服务器端验证。
      猜你喜欢
      • 2015-11-09
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多