2010-05-20 3 views
1

Я хочу создать правило проверки для двух наборов даты (startDate less than endDate).ASP.NET MVC2 Пользовательская проверка jQuery: client -side

создать атрибут проверки:

[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; 
    } 
} 

и добавил ти к моему DTO:

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

Я создал валидатор:

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

И зарегистрировал его в Global.asax .cs в 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

+0

, обновленную для вашего, с примером jquery – XGreen

Смежные вопросы