2011-03-25 96 views
2

我想爲我的自定義類型實現客戶端驗證,但我不知道如何爲最小/最大驗證器。添加mvc3不顯眼的驗證最小/最大驗證器

型號:

[MultilanguagePropertyRequired(ErrorMessageResourceName = "fld_Description_val_Required", ErrorMessageResourceType = typeof(Resources.Service.Controllers.Firm))] 
[MultilanguagePropertyStringLength(1000, MinimumLength = 150, ErrorMessageResourceName = "fld_Description_val_MinLength_lbl", ErrorMessageResourceType = typeof(Resources.Service.Controllers.Firm))]  
[Display(Name = "fld_Description_lbl", ResourceType = typeof(Resources.Service.Controllers.Firm))] 
public MultilanguageProperty<string> Description 
{ 
    get 
    { 
     return this.GetMultilanguageProperty("Description", string.Empty, this); 
    } 

    set 
    { 
     this.SetMultilanguageProperty("Description", value); 
    } 
} 

這是我的一個擴展 「StringLegth」 自定義字符串長度屬性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)] 
public class MultilanguagePropertyStringLengthAttribute : StringLengthAttribute, IClientValidatable 
{ 
    public MultilanguagePropertyStringLengthAttribute(int length) : base(length) 
    { 
    } 

    public override bool IsValid(object value) 
    { 
     string strValue = (string)(value as MultilanguageProperty<string>).Value; 

     return base.IsValid(strValue); 
    } 

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

然後對我的看法我有這樣的: ..

<script type="text/javascript"> 
    (function ($) { 
     $.validator.unobtrusive.adapters.addBool("multilanguagerequired", "required"); 
     $.validator.unobtrusive.adapters.addMinMax("multilanguagestringlength", "minlength", "maxlength"); 
    } (jQuery)); 
</script> 

..

哪些不起作用。我在這裏錯過了什麼? 謝謝

回答

3

我正在以不同的方式解決類似的問題,但嘿,嘗試這段代碼的一些部分!我的意思是用於字符串長度驗證的GetClientValidationRules()方法。

public sealed class MyStringLengthAttribute : StringLengthAttribute, IClientValidatable 
    { 
     private int? labelId; 

     public MyStringLengthAttribute(int label, int maximumLength) 
      : base(maximumLength) 
     { 
      labelId = label; 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      if (labelId.HasValue) 
      { 
       return String.Format(MyLabel.Label(labelId.Value), name); 
      } 
      return String.Format(MyLabel.Default("FieldTooLong_Validation", "Field {0} is too long"), name); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      StringLengthAttributeAdapter adapt = new StringLengthAttributeAdapter(metadata,context, this); 
      return adapt.GetClientValidationRules(); 
     } 
    } 

我使用我在.NET框架中找到的Adapter類,並且不需要自定義Javascript工作。

,並依照本如果你仍然想要做自定義JS部分http://itmeze.com/2010/12/06/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/

+0

我希望我可以upvote你的答案100次,先生。謝謝。 – 2013-01-10 11:03:42

4

沒有必要有一個自定義客戶端驗證。你可以嘗試這樣的:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public sealed class ValidatePasswordLengthAttribute : ValidationAttribute, IClientValidatable { 
    private const string _defaultErrorMessage = "'{0}' must be between {1} and {2} characters long."; 
    private readonly int _minCharacters, _maxCharacters; 

    public ValidatePasswordLengthAttribute(int minLength, int maxLength) 
     : base(_defaultErrorMessage) { 
      _minCharacters = minLength; 
      _maxCharacters = maxLength; 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, 
      name, _minCharacters, _maxCharacters); 
    } 

    public override bool IsValid(object value) { 
     string valueAsString = value as string; 
     return (valueAsString != null && valueAsString.Length >= _minCharacters && valueAsString.Length <= _maxCharacters); 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     return new[]{ 
      new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minCharacters, _maxCharacters) 
     }; 
    } 
} 

它來自內置的MVC3互聯網項目模板。

1

我也有同樣的問題。你缺少在GetClientValidationRules ValidationParameters:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
{ 
    var rule = new ModelClientValidationRule 
        { 
         ErrorMessage = this.ErrorMessage, 
         ValidationType = "dayrange" 
        }; 
    rule.ValidationParameters.Add("min", _minimumDays); 
    rule.ValidationParameters.Add("max", _maximumDays); 
    yield return rule; 
} 

我仍然有與jQuery.validator和jQuery.validator.unobtrusive.adapters之間的佈線問題,但這裏的代碼。希望它有幫助:

$(function() { 
     jQuery.validator.addMethod('dayRange', function (value, element, param) { 
     if (!value) return false; 
     var valueDateParts = value.split(param.seperator); 
     var minDate = new Date(); 
     var maxDate = new Date(); 
     var now = new Date(); 
     var dateValue = new Date(valueDateParts[2], 
          (valueDateParts[1] - 1), 
          valueDateParts[0], 
          now.getHours(), 
          now.getMinutes(), 
          (now.getSeconds()+5)); 

     minDate.setDate(minDate.getDate() - parseInt(param.min)); 
     maxDate.setDate(maxDate.getDate() + parseInt(param.max)); 

     return dateValue >= minDate && dateValue <= maxDate; 
    }); 

    jQuery.validator.unobtrusive.adapters.addMinMax('dayrange', 'minlength', 'maxlength', 'dayrange'); 

    }(jQuery));