【问题标题】:Greater Than or Equal To Today Date validation annotation in MVC3MVC3 中的大于或等于今天日期验证注释
【发布时间】:2012-06-04 20:23:07
【问题描述】:

有没有人见过需要单个选定日期等于或大于当前日期的日期验证的 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";
        }
    }
}

在我的模型中

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

【问题讨论】:

  • Server DateTime.Today 和客户端 datetime 可能不同。我认为您应该传递服务器端时间,而不是使用 JavaScript new Date()。
  • 另一个问题是您假设客户具有美国日期设置 (mm/dd/yyyy) (今天 = 月 + '/' + 天 + '/' + 年 + ' ' + 小时 + '.' + 分钟 + '.' + 秒;)在其他语言环境中不起作用。
  • 很好,但我们不支持美国以外的任何其他地区
  • 太糟糕了。这意味着我将无法使用您的网站 :-( 我的桌面上有 en-AU 语言环境,我的笔记本电脑上有 ru-UA 语言环境。

标签: asp.net-mvc-3 datetime data-annotations


【解决方案1】:

创建自定义属性。

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

}

代码是即兴写的,所以请修正所有错误:)

【讨论】:

  • 我突然忘记了如何制作 javascript 版本。如果您有兴趣,我将不得不检查一些旧代码。
  • 我有一个可以适应的客户端 :-) 谢谢!
  • 访问修改应该是“受保护的”而不是“公共的”——否则这是可行的。
【解决方案2】:

使用[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);    
}

【讨论】:

  • 我考虑过,但这不是我想要的方向,我还需要为它创建客户端 jquery。好建议!
  • 不需要客户端 jquery。
  • 不是远程的,我的意思是我更喜欢使用的数据注释。我不想为此单独调用服务器。
  • 为什么不呢,它又快又简单。无需制作自定义属性并将其注册到 global.asax 中。我一直使用它进行特定的验证。
  • 部分是因为我已经在使用此策略进行所有其他自定义验证,所以我已经注册了它们,因此选择的模式现在已成为我们的“必需”模式。所以当我已经有了一个混合策略时,我不想进入混合策略。这是一个很好的建议,我不会敲它 :-) 只是不是我想要的
【解决方案3】:

完成此任务的简单方法是使用CompareValidator

下面的代码使用了 AjaxControlToolKit 的CalendarExtender。 将以下代码复制到您的 HTML 指令中

<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>

在 CSS 中添加以下行

.hiddenbox {display:none;}

【讨论】:

  • 这是带有 Razor 而非 WebForms 的 MVC,不使用服务器端控件。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2016-07-07
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2014-08-14
相关资源
最近更新 更多