如何在日期字符串模型属性上获取客户端验证

时间:2015-01-02 22:00:34

标签: c# jquery asp.net-mvc

在我的模型中,我有一个包含日期属性的对象。 (使用字符串是因为这是以前的程序员所写的):

[Display(Name = "Payment Date")]
[Date(ErrorMessage = "Please enter a valid date")]
public string PaymentDate { get; set; }

以下是PaymentDate使用的自定义日期属性:

public sealed class DateAttribute : ValidationAttribute, IClientValidatable 
{
    public override bool IsValid(object value)
    {
        var dateString = value as string;
        if (string.IsNullOrWhiteSpace(dateString))
        {
            return false;
        }
        DateTime result;
        var success = DateTime.TryParse(dateString, out result);
        return success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule 
        { 
            ValidationType = "paymentdate", 
            ErrorMessage = this.ErrorMessage } 
        };
    }
}

这在服务器端很有用,但在客户端却不行。 在视图中我试图创建一个自定义函数来进行验证,但它似乎无法正常工作。由test

之前的点引起的语法错误
    // custom jquery validation method    
    jQuery.validator.addMethod('validDate', function (value, element, params) {
        return Invalid|NaN/.test(new Date(value)); 
    }, '');

    // unobtrusive adapter
    jQuery.validator.unobtrusive.adapters.add('paymentdate', {}, function (options) {
        options.rules['validDate'] = true;
        options.messages['validDate'] = options.message;
    });

如何使用我已经在工作的服务器端验证进行客户端验证?

注意:我使用的是自定义属性,因为稍后会添加一些自定义验证。

2 个答案:

答案 0 :(得分:1)

jQuery.validator.addMehod('validDate', function (value, element, params) {
        return Invalid|NaN/.test(new Date(value)); 
    }, '');

jQuery.validator.addMethod('validDate', function (value, element, params) {
        return Invalid|NaN/.test(new Date(value)); 
    }, '');

您似乎错过了该功能。

答案 1 :(得分:1)

抛出语法错误,因为正则表达式无效,开头需要/

/Invalid|NaN/.test(...)

但是,我会指出几件事情。

  1. 建议您在解析日期字符串时使用Date.parse
  2. 检查NaN
  3. 时最好使用isNaN功能

    以下是验证器的修订版

    jQuery.validator.addMethod('validDate', function (value, element, params) {
        return !isNaN(Date.parse(value)); 
    }, '');