Аннотация проверки даты больше или равна дате в MVC3

Кто-нибудь видел аннотацию данных MVC3 для проверки даты, которая требует, чтобы одна выбранная дата была равна или больше текущей даты?

Если есть уже третье лицо, добавьте, что это тоже круто. Я уже использую DataAnnotationsExtensions, но он не предлагает того, что я ищу.

Похоже, что здесь нет никаких упоминаний об этом. Итак, надеясь, что кто-то уже решил эту проблему, прежде чем я попытаюсь заново изобрести колесо и написать свой собственный валидатор.

Я пыталсяRange но это требует 2 даты, и обе должны быть константами в строковом формате, таких как[Range(typeof(DateTime), "1/1/2011", "1/1/2016")] но это не помогает. И расширения DataAnnotationsMin валидатор принимает толькоint а такжеdouble

Update решаемая

Благодаря @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";
        }
    }
}

И в моей модели

[Required]
[DateMustBeEqualOrGreaterThanCurrentDate]
public DateTime SomeDate { get; set; }

Скрипт на стороне клиента

/// <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");
 CD Smith10 дек. 2012 г., 13:59
Хороший звонок, но мы не поддерживаем другие языки, кроме США.
 Maksym Kozlenko10 дек. 2012 г., 05:27
Другая проблема заключается в том, что вы предполагаете, что у клиента есть настройки даты в США (мм / дд / гггг) (сегодня = месяц + "/"; + день + "/" + год + "+" + часы + "; . "+ минуты +". "+ секунды;) Это не будет работать в других локалях.
 Maksym Kozlenko10 дек. 2012 г., 05:22
Сервер DateTime.Today и datetime на стороне клиента могут отличаться. Я думаю, что вы должны передавать время на стороне сервера вместо использования JavaScript new Date ().
 Maksym Kozlenko10 дек. 2012 г., 22:55
Очень плохо. Это означает, что я не смогу использовать ваш веб-сайт :-( У меня есть локаль en-AU на моем рабочем столе и локаль ru-UA на моем ноутбуке.

Ответы на вопрос(3)

CompareValidator.

Код ниже использует AjaxControlToolKitCalendarExtender. Copy the below code to your HTML directive

<asp:TextBox ID="txtCompletionDate" runat="server" CssClass="txtNormal"></asp:TextBox>
                        <cc1:CalendarExtender ID="CalendarExtender1" TargetControlID="txtCompletionDate"
                            Format="dd/MM/yyyy" runat="server">
                        </cc1:CalendarExtender>
       ,                 <asp:RequiredFieldValidator ID="rfvCompletionDate" runat="server" ControlToValidate="txtCompletionDate"
                            CssClass="labelError" ErrorMessage="*"></asp:RequiredFieldValidator>
                        <asp:CompareValidator ID="cvDate" runat="server" ControlToCompare="hiddenbox" ErrorMessage="*"
                            ControlToValidate="txtCompletionDate" CssClass="labelError" ToolTip="Completion  Date should be greater than or equal to Today"
                            Operator="GreaterThanEqual" Type="Date"></asp:CompareValidator>                        
                        <asp:TextBox ID="hiddenbox" runat="server" CssClass="hiddenbox">
</asp:TextBox>

add the below line in the CSS

.hiddenbox {display:none;}
 CD Smith09 июл. 2012 г., 14:34
Это MVC с Razor, а не с WebForms, элементы управления на стороне сервера не используются.

[Remote] для специальных проверок, просто и легко:

Ваша модель:

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

Ваше действие:

[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);    
}
 CD Smith04 июн. 2012 г., 22:49
Не для удаленного, я имел в виду аннотацию данных, которую я предпочел бы использовать. Я не хочу отдельного вызова к серверу для этого.
 CD Smith04 июн. 2012 г., 22:55
Частично потому, что я уже использую эту стратегию для всех других своих пользовательских проверок, поэтому я уже регистрирую их, поэтому выбранный шаблон теперь стал нашим «обязательным». шаблон. Поэтому я не хочу вдаваться в стратегии микширования, когда они у меня уже есть. Это хорошее предложение, хотя я не сбиваю его с толку :-) Только не то, что я ищу
 CD Smith04 июн. 2012 г., 22:40
Я считал это, но это не то направление, в котором я хочу идти, мне нужно будет также создать для него jquery на стороне клиента. Хорошее предложение, хотя!
 04 июн. 2012 г., 22:47
Не требуется jquery на стороне клиента.
 04 июн. 2012 г., 22:51
Почему бы и нет, это быстро и просто. Не нужно создавать собственный атрибут и регистрировать его в global.asax. Я использую это все время для конкретных проверок.
Решение Вопроса

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");
    }

}

код был списан с манжеты, так что исправляйте ошибки :)

 CD Smith04 июн. 2012 г., 22:41
У меня есть клиентская сторона, которую я могу адаптировать :-) Спасибо!
 02 февр. 2016 г., 13:50
Измененный доступ должен быть «защищен» вместо "публичного" - иначе это работает.
 04 июн. 2012 г., 22:36
Я забыл с головы до головы, как сделать версию javascript. Я должен проверить какой-то старый код, если вы заинтересованы.

Ваш ответ на вопрос