2011-02-25 51 views
7

升級到JQuery 1.5和更高版本1.5.1後,我的比較驗證失敗。我正在使用JQuery.Validate 1.7。我的視圖模型具有以下數據註釋:JQuery 1.5中斷比較驗證(JQuery驗證1.8)

/// <summary> 
/// Gets or sets the full name. 
/// </summary> 
/// <value>The full name.</value> 
[Required] 
[Display(Name = "fullname", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
public string FullName { get; set; } 

/// <summary> 
/// Gets or sets the email. 
/// </summary> 
/// <value>The email.</value> 
[DataType(DataType.EmailAddress)] 
[Display(Name = "email", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "EmailRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages), ErrorMessageResourceName = "EmailInvalid")] 
public string Email { get; set; } 

/// <summary> 
/// Gets or sets the password. 
/// </summary> 
/// <value>The password.</value> 
[DataType(DataType.Password)] 
[Display(Name = "password", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[ValidatePasswordLengthAttribute(ErrorMessageResourceName = "PasswordLength", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
public string Password { get; set; } 

/// <summary> 
/// Gets or sets the confirm password. 
/// </summary> 
/// <value>The confirm password.</value> 
[DataType(DataType.Password)] 
[Display(Name = "confirmPassword", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[Compare("Password", ErrorMessageResourceName = "PasswordsMustMatch", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
public string ConfirmPassword { get; set; } 

我輸入什麼都值,密碼字段是永遠不會相同。

更新 - ASP.NET AntiForgeryToken陷入困境。

在Firebug設置斷點鬼混後,我注意到,在equalTo驗證功能,開始在jquery.validate.js線1065,即發現目標元素,是不是密碼字段 - 但__RequestVerificationToken那當您使用Html.AntiForgeryToken()幫手時,ASP.NET MVC會寫入。

這意味着我們甚至沒有比較正確的輸入元素。要解決這個問題,我添加了一個骯髒的黑客到jquery.validate.js文件:

// http://docs.jquery.com/Plugins/Validation/Methods/equalTo 
equalTo: function (value, element, param) { 
    // bind to the blur event of the target in order to revalidate whenever the target field is updated 
    // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead 
    var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 
     $(element).valid(); 
    }); 

    if ($(target).is("input[type=hidden]") && $(target).attr("name") == "__RequestVerificationToken") { 
     var otherElementId = $(element).attr("id"); 
     var underScoreIndex = otherElementId.indexOf("_"); 
     otherElementId = otherElementId.substring(0, underScoreIndex + 1); 
     otherElementId += $(element).attr("data-val-equalto-other").substring(2); 

     target = $("#" + otherElementId); 
    } 

    return value == target.val(); 
} 

這個技巧,獲取數據-VAL-equalto-其他屬性的值,並用自己的ID混合它,找到正確的輸入元素。在所有情況下都不起作用。但在上述情況下適用於我。

回答

11

我發現,這是由於在jquery.validate.unobtrusive.js錯誤

在不顯眼的代碼添加試圖通過其名稱屬性來查找匹配元件,用下面的代碼的equalto適配器:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0]; 

的fullOtherName變量經常是(可能總是)命名空間具有周期,所以jQuery的塞萊ctor返回太多輸入,並選擇第一個。期間需要與.replace進行轉義,給你(「」‘\\。’):

element = $(options.form).find(":input[name=" + fullOtherName.replace(".", "\\.") + "]")[0]; 

類似的結構中有幾行低,還需要是固定的(以及作爲縮小的Javascript)。

+0

它的工作原理!不知道這個錯誤是否已經存在於微軟的世界。我應該通過Microsoft Connect報告它,以便在下一個版本中解決這個問題。 – MartinHN

+0

它已在代碼中修復。謝謝。 http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute – jsgoupil

+1

這非常有幫助!但是,在我的情況下,我不得不將它改爲元= $(options.form).find(「:input [name ='」+ fullOtherName.replace(「。」,「\\。」)+「']」 )[0];注意注入值周圍的單引號。並且不要忘記在縮小版本中修復它! :) –

0

http://bassistance.de/jquery-plugins/jquery-plugin-validation/

請注意:最新的版本是沒有,但 ,使用jQuery 1.5.x.兼容您在 GitHub repository中可以找到兼容版本。

然而,沒有任何分支機構的工作對我來說...

+0

實際上,它甚至沒有使用1.5。我想我們必須等待他們解決問題:( – MartinHN

+0

我發現了一些新的信息,看看上面。 – MartinHN

+0

乾杯,馬丁!我的問題是,我不使用防僞令牌;-) –

0

爲了迴應MartinHN的更新,我遇到了同樣的問題並應用相同的修復程序。由於我使用的是嵌套編輯器模板,因此我的其他ElementId中有多個下劃線,因此將其代碼更改爲使用lastIndexOf而不是indexOf。例如。

var underScoreIndex = otherElementId.indexOf("_"); 

改爲:

var underScoreIndex = otherElementId.lastIndexOf("_"); 
0

它看起來像如果你看看新MVC4代碼。你可以看到新版本的jquery.validate.unobtrusive。js: http://code.msdn.microsoft.com/ASPNET-MVC-4-Mobile-e99ed0ed/sourcecode?fileId=49443&pathId=640259357 如果您做了差異。它與MVC3版本完全相同,除了以上述小改動以不同方式完成之外。所以它應該是你所要做的就是用代碼示例中的代碼替換你的jquery.validate.unobtrusive.js,並且所有的都可以工作。

就這麼你知道。我正在使用jquery 1.6.4和jquery mobile 1.0.1

2

如果它仍然相關,我有同樣的問題,升級所有的腳本,現在它的工作。 即時通訊使用以下內容:Jquery 1.8(從他們的cdn官方版本),jquery驗證1.9和jquery unobtrusive驗證從微軟在nunget提供的最新軟件包(這很奇怪,得到你的jquery驗證1.8而不是1.9)。上帝保佑微軟和三個腳本文件的管理混亂:\

1

您可以使用最新版本的jquery和jquery.validate關閉Microsoft CDN。我看不到jquery.validate.unobtrusive.min.js的更新版本。

隨MVC4提供的jquery.validate.unobtrusive.min.js版本正常工作。

<!-- Scripts --> 
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.10.0/jquery.validate.min.js"></script> 
<!-- ToDo: Will Microsoft fix this on the CDN? --> 
<script type="text/javascript" src="@Url.Content("~/Scripts/Frameworks/jquery.validate.unobtrusive.min.js")"></script>