2010-05-20 105 views
1

我想为2个日期选择器(startDate小于endDate)创建验证规则。ASP.NET MVC2自定义jQuery验证:客户端

我创建了一个验证特性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class DateCompareAttribute : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{0}' is less then '{1}'."; 

    public DateCompareAttribute(string startDateProperty, string endDateProperty) 
     : base(_defaultErrorMessage) 
    { 
     StartDateProperty = startDateProperty; 
     EndDateProperty = endDateProperty; 
    } 

    public string StartDateProperty { get; private set; } 
    public string EndDateProperty { get; private set; } 


    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, StartDateProperty, EndDateProperty); 
    } 

    public override bool IsValid(object value) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
     object startValue = properties.Find(StartDateProperty, true).GetValue(value); 
     object endValue = properties.Find(EndDateProperty, true).GetValue(value); 
     if (startValue.GetType() == typeof(DateTime?) && endValue.GetType() == typeof(DateTime?)) 
     { 
      var start = ((DateTime?)startValue); 
      var end = ((DateTime?)endValue); 
      return (start.Value < end.Value); 
     } 
     return false; 
    } 
} 

,并加入TI我的DTO:

[DateCompare("StartDate", "EndDate")] 
public class QualificationInput{...} 

我创建了一个验证:在Global.asax中

public class DateCompareValidator : DataAnnotationsModelValidator<DateCompareAttribute> 
{ 
    string startField; 
    private string endField; 
    string _message; 

    public DateCompareValidator(ModelMetadata metadata, ControllerContext context, DateCompareAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
     startField = attribute.StartDateProperty; 
     endField = attribute.EndDateProperty; 
     _message = attribute.ErrorMessage; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "dateCompare" 
     }; 
     rule.ValidationParameters.Add("startField", startField); 
     rule.ValidationParameters.Add("endField", endField); 

     return new[] { rule }; 
    } 
} 

并将其注册.cs in Application_Start():

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DateCompareAttribute), typeof(DateCompareValidator)); 

在MicrosoftMvcJQueryValidation.js我有此变化:

switch (thisRule.ValidationType) 
{ 
..... 
    case "dateCompare": 
     __MVC_ApplyValidator_DateCompare(rulesObj, 
     thisRule.ValidationParameters["startField"], thisRule.ValidationParameters["endField"]); 
     break; 
..... 
} 

function __MVC_ApplyValidator_DateCompare(object, startField, endField) { 
    object["startField"] = startField; 
    object["endField"] = endField; 
} 

jQuery.validator.addMethod("dateCompare", function(value, element, params) { 
    if ($('#' + params["startField"]).val() < $('#' + params["endField"]).val()) 
    { return true; } 
    return false; 
}, jQuery.format("Error")); 

但它不工作:(无客户端验证这一类型的规则(其他类型等所要求的正常工作)

我在做什么错了?

回答

1

我就复制粘贴了整个事情,但我认为这是最好的,你刚才读菲尔哈克指南custom validation in MVC

首先,我们需要一个模型类。让我们做一些简单的像客户:

public partial class Customer 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

那么你的验证逻辑

[MetadataType(typeof(CustomerMetaData))] 
public partial class Customer 
{ 
    class CustomerMetaData 
    { 
     [Required(ErrorMessage="You must supply a name for a customer.")] 
     [StringLength(50, ErrorMessage = "A customer name cannot exceed 50 characters.")] 
     public string Name { get; set; } 
    } 
} 

然后勾你的脚本

<script type="text/javascript" src="../../Scripts/jquery-1.3.2.min.js"></script> 
<script type="text/javascript" src="../../Scripts/jquery.validate.min.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftMvcJQueryValidation.js"></script> 

最后,你的表单标签开始前的地方,添加对视图代码进行标记:

<% Html.EnableClientValidation(); %> 
+0

我的确看过这篇文章,当我进行修改时,我被它引导了。但不同的是,我使用jQuery验证 – Lullaby 2010-05-20 11:59:21

+0

更新为您的jQuery示例 – XGreen 2010-05-20 12:21:09