Asp.net mvc asp.net mvc3模型中的日期比较

Asp.net mvc asp.net mvc3模型中的日期比较,asp.net-mvc,asp.net-mvc-3,razor,jquery-validate,Asp.net Mvc,Asp.net Mvc 3,Razor,Jquery Validate,我的模型中有两个字段 CreateDateTo CreateDateFrom 这是这样呈现的 <b>Start Date</b> @Html.EditorFor(model => model.AdvanceSearch.CreateDatefrom, new { @class = "picker startDate" }) <b>End Date</b> @Html.EditorFor(model => model.Advance

我的模型中有两个字段

  • CreateDateTo
  • CreateDateFrom
  • 这是这样呈现的

    <b>Start Date</b>  @Html.EditorFor(model => model.AdvanceSearch.CreateDatefrom, new {  @class = "picker startDate" })
    
    <b>End Date</b> @Html.EditorFor(model => model.AdvanceSearch.CreateDateto, new { @class = "picker endDate" })
    
    Start Date@Html.EditorFor(model=>model.AdvanceSearch.CreateDatefrom,new{@class=“picker startDate”})
    结束日期@Html.EditorFor(model=>model.AdvanceSearch.CreateDateto,new{@class=“picker endDate”})
    
    我有一个验证场景,enddate不应该大于start date,目前我正在用jquery验证它

    $.validator.addMethod("endDate", function (value, element) {
            var startDate = $('.startDate').val();
            return Date.parse(startDate) <= Date.parse(value);
        }, "* End date must be Equal/After start date");
    
    $.validator.addMethod(“endDate”,函数(值,元素){
    var startDate=$('.startDate').val();
    
    return Date.parse(startDate)您需要针对模型创建一个自定义验证。您可以将它放在if(model.IsValid)之后的控制器中



    if(Model.End我想说的是,除非你在某种内部网应用程序中控制你的客户端浏览器,否则你不应该完全依赖Javascript。如果该应用程序是面向公众的,请确保你有客户端和服务器端验证

    此外,在模型对象内实现服务器端验证的更简洁方法可以通过如下所示的自定义验证属性来完成。然后,您的验证将集中,您不必显式比较控制器中的日期

    public class MustBeGreaterThanAttribute : ValidationAttribute
    {
        private readonly string _otherProperty;
    
        public MustBeGreaterThanAttribute(string otherProperty, string errorMessage) : base(errorMessage)
        {
            _otherProperty = otherProperty;
        }
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(_otherProperty);
            var otherValue = otherProperty.GetValue(validationContext.ObjectInstance, null);
            var thisDateValue = Convert.ToDateTime(value);
            var otherDateValue = Convert.ToDateTime(otherValue);
    
            if (thisDateValue > otherDateValue)
            {
                return ValidationResult.Success;
            }
    
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
    }
    
    然后可以将其应用于您的模型,如下所示:

    public class MyViewModel
    {
        [MustBeGreaterThan("End", "Start date must be greater than End date")]
        public DateTime Start { get; set; }
    
        public DateTime End { get; set; }
    
        // more properties...
    }
    

    正如Nick在下面指出的,这个答案中所说的一切都是不好的。这篇文章有两个主要观点:1)依赖客户端验证(即javascript)。只是不!客户端验证是为了方便用户,它对确保数据的完整性没有任何作用。2)下面,Nick为实现服务器端验证提供了更详细、更优雅的解决方案。
    public class MyViewModel
    {
        [MustBeGreaterThan("End", "Start date must be greater than End date")]
        public DateTime Start { get; set; }
    
        public DateTime End { get; set; }
    
        // more properties...
    }