大于或等于今天在MVC3中的日期验证注释

CD *_*ith 25 datetime data-annotations asp.net-mvc-3

有没有人看过日期验证的MVC3数据注释要求单个选定日期等于或大于当前日期?

如果已经有第三方添加,那也很酷.我已经在使用DataAnnotationsExtensions,但它没有提供我正在寻找的东西.

似乎没有任何关于此的参考.因此,希望有人在我尝试重新发明轮子并编写自己的自定义验证器之前已经解决了这个问题.

我已经尝试Range但需要2个日期,两者都必须是字符串格式的常量,[Range(typeof(DateTime), "1/1/2011", "1/1/2016")]但这没有帮助.DataAnnotationsExtensions Min验证器只接受intdouble


更新已解决

感谢@BuildStarted,这是我最终得到的,它在我的脚本中运行良好的服务器端和现在的客户端


using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace Web.Models.Validation {

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class DateMustBeEqualOrGreaterThanCurrentDateValidation : ValidationAttribute, IClientValidatable {

        private const string DefaultErrorMessage = "Date selected {0} must be on or after today";

        public DateMustBeEqualOrGreaterThanCurrentDateValidation()
            : base(DefaultErrorMessage) {
        }

        public override string FormatErrorMessage(string name) {
            return string.Format(DefaultErrorMessage, name);
        }  

        protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
            var dateEntered = (DateTime)value;
            if (dateEntered < DateTime.Today) {
                var message = FormatErrorMessage(dateEntered.ToShortDateString());
                return new ValidationResult(message);
            }
            return null;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
            var rule = new ModelClientCustomDateValidationRule(FormatErrorMessage(metadata.DisplayName));
            yield return rule;
       }
    }

    public sealed class ModelClientCustomDateValidationRule : ModelClientValidationRule {

        public ModelClientCustomDateValidationRule(string errorMessage) {
            ErrorMessage = errorMessage;
            ValidationType = "datemustbeequalorgreaterthancurrentdate";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中

[Required]
[DateMustBeEqualOrGreaterThanCurrentDate]
public DateTime SomeDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

客户端脚本

/// <reference path="jquery-1.7.2.js" />

jQuery.validator.addMethod("datemustbeequalorgreaterthancurrentdate", function (value, element, param) {
    var someDate = $("#SomeDate").val();
    var today;
    var currentDate = new Date();
    var year = currentDate.getYear();
    var month = currentDate.getMonth() + 1;  // added +1 because javascript counts month from 0
    var day = currentDate.getDate();
    var hours = currentDate.getHours();
    var minutes = currentDate.getMinutes();
    var seconds = currentDate.getSeconds();

    today = month + '/' + day + '/' + year + '  ' + hours + '.' + minutes + '.' + seconds;

    if (someDate < today) {
        return false;
    }
    return true;
});

jQuery.validator.unobtrusive.adapters.addBool("datemustbeequalorgreaterthancurrentdate");
Run Code Online (Sandbox Code Playgroud)

Bui*_*ted 17

创建自定义属性.

public class CheckDateRangeAttribute: ValidationAttribute {
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
        DateTime dt = (DateTime)value;
        if (dt >= DateTime.UtcNow) {
            return ValidationResult.Success;
        }

        return new ValidationResult(ErrorMessage ?? "Make sure your date is >= than today");
    }

}
Run Code Online (Sandbox Code Playgroud)

代码是从袖口写下来所以修复任何错误:)

  • 修改后的访问应该"受保护"而不是"公共" - 否则这是有效的. (2认同)

Mat*_*cic 9

使用[Remote]特殊的验证,简单和容易:

你的型号:

[Remote("ValidateDateEqualOrGreater", HttpMethod="Post", 
    ErrorMessage = "Date isn't equal or greater than current date.")]
public DateTime Date { get; set; }
//other properties
Run Code Online (Sandbox Code Playgroud)

你的行动:

[HttpPost]
public ActionResult ValidateDateEqualOrGreater(DateTime Date)
{
     // validate your date here and return True if validated
     if(Date >= DateTime.Now)
     {
       return Json(true);
     }
     return Json(false);    
}
Run Code Online (Sandbox Code Playgroud)