2012-07-16 90 views
1

有人可以幫我解決客戶端驗證問題(MVC4 RC,VS2010)嗎? Intellisense未在jQuery.validator中顯示addMethod。當我運行該應用程序時,它會在此方法中引發javascript null錯誤。我想讓用戶輸入大於當前時間的時間。我CustomValidation.js文件看起來像這樣:客戶端驗證問題 - MVC 4 RC

/// <reference path="jquery-1.7.2-vsdoc.js" /> 
/// <reference path="jquery.validate-vsdoc.js" /> 
/// <reference path="jquery.validate.unobtrusive.js" /> 

jQuery.validator.addMethod('dategreaterthan', function (value, element, param) { 
     var today = new Date(); 
     return Date.parse(value) > today; 
}); 

$.validator.unobtrusive.adapters.add("dategreaterthan", function (options) { 
    options.rules["dategreaterthan"] = true; 
    options.messages["dategreaterthan"] = options.message; 
}); 

這裏是自定義驗證屬性碼:

public class DateGreaterThanAttribute : ValidationAttribute, IClientValidatable 
    { 
     private const string DefaultErrorMessage = "{0} Time must be greater than current time"; 

     public DateGreaterThanAttribute() : 
      base(DefaultErrorMessage) 
     { } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      ValidationResult validationResult = ValidationResult.Success; 

      if (((DateTime)value).TimeOfDay >= DateTime.Now.TimeOfDay) 
       return validationResult; 
      else 
      { 
       return new ValidationResult(FormatErrorMessage(this.ErrorMessage));     
      } 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      return base.FormatErrorMessage(name); 
     } 


     #region IClientValidatable Members 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      var rule = new ModelClientValidationRule(); 
      rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
      rule.ValidationType = "dategreaterthan"; 
      yield return rule;     
     } 

     #endregion 
    } 

我已經加入了CustomValidation.js到BundleConfig.cs文件,如下所示: 公衆類BundleConfig(不知道這是否是正確的):

public static void RegisterBundles(BundleCollection bundles) 
    { 
     bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
        "~/Scripts/jquery-1.*")); 

     bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
        "~/Scripts/jquery-ui*")); 

     bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
        "~/Scripts/jquery.unobtrusive*", 
        "~/Scripts/jquery.validate*")); 

     bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
        "~/Scripts/modernizr-*")); 

     bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); 

     bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
        "~/Content/themes/base/jquery.ui.core.css", 
        "~/Content/themes/base/jquery.ui.resizable.css", 
        "~/Content/themes/base/jquery.ui.selectable.css", 
        "~/Content/themes/base/jquery.ui.accordion.css", 
        "~/Content/themes/base/jquery.ui.autocomplete.css", 
        "~/Content/themes/base/jquery.ui.button.css", 
        "~/Content/themes/base/jquery.ui.dialog.css", 
        "~/Content/themes/base/jquery.ui.slider.css", 
        "~/Content/themes/base/jquery.ui.tabs.css", 
        "~/Content/themes/base/jquery.ui.datepicker.css", 
        "~/Content/themes/base/jquery.ui.progressbar.css", 
        "~/Content/themes/base/jquery.ui.theme.css")); 
     bundles.Add(new ScriptBundle("~/bundles/customvalidation").Include(
        "~/Scripts/CustomValidation.js"));  
    } 
+0

這可能不是問題,但您的驗證總是返回錯誤 – 2012-07-16 14:14:55

+0

這是一個錯字。我只是更新了代碼。你知道它爲什麼在addMethod上拋出null錯誤嗎? – rk1962 2012-07-16 14:37:38

+0

創建一個新的MVC 4/RC互聯網應用程序並使用F12工具來了解帳戶控制器/視圖(註冊,更改密碼等)中的驗證。這樣你可以找出爲什麼沒有加載jQuery。 – RickAndMSFT 2012-07-16 18:45:08

回答

2

確保你已經包括了jqueryval束(含~/Scripts/jquery.unobtrusive*~/Scripts/jquery.validate*腳本)之前,您的自定義捆綁(您已與jqueryui關聯)。所以順序如下:

@Scripts.Render("~/bundles/jquery") 
@Scripts.Render("~/bundles/jqueryval") 
@Scripts.Render("~/bundles/jqueryui") 
+0

我只是更新了BundleConfig.cs和_Layout.cstml,沒有運氣。 '@ Scripts.Render(「〜/ bundles/jqueryui」) @ Scripts.Render(「〜/ bundles/jquery」) @ Scripts.Render(「〜/ bundles/jqueryval」/bundles/customvalidation「) @RenderSection(」scripts「,required:false)' – rk1962 2012-07-16 15:11:41

+0

對不起,我不能repro。這對我有用。你可以給我你的樣品項目嗎? – 2012-07-16 16:18:48

+0

使用調試器查看加載了哪些腳本。 – RickAndMSFT 2012-07-16 18:46:57