2012-04-19 54 views
0

我使用的例子在The Complete Guide To Validation In ASP.NET MVC 3創建RequiredIf驗證特性(這是約1/3在網頁的「一個更復雜的標題下定製驗證器「)。除了一個場景外,這一切都可以正常工作,這就是說,如果我需要針對複雜類型進行驗證。例如,我有以下型號:獲取從ModelClientValidationRequiredIfRule方法在自定義複雜類型的全名ValidationAttribute

public class MemberDetailModel 
{ 
    public int MemberId { get; set; } 
    // Other model properties here 
    public MemberAddressModel HomeAddress { get; set; } 
    public MemberAddressModel WorkAddress { get; set; } 
} 

public class MemberAddressModel 
{ 
    public bool DontUse { get; set; } 
    // Other model properties here 

    [RequiredIf("DontUse", Comparison.IsEqualTo, false)] 
    public string StreetAddress1 { get; set; } 
} 

的問題是,當該物業的StreetAddress屬性驗證呈現,得到它的裝飾與data-val-requiredif-other="DontUse"屬性。不幸的是,由於該地址是主模型的子類型,因此需要用名稱HomeAddress_Dont使用而不僅僅是Dont使用來裝飾。

非常奇怪的是,驗證對服務器端驗證工作正常,但客戶端不顯眼的驗證失敗,JS錯誤,因爲JS無法找到名爲「DontUse」的對象。

所以,我需要找到一個方法來改變ModelClientValidationRequiredIfRule方法知道它是驗證屬性是子類型父類型的,如果是這樣,在前面加上了ParentType_的「otherProperty」字段(如otherProperty成爲HomeAddress_DontUse

我曾嘗試在typeof(MemberAddressModel)傳遞作爲屬性的參數,但是在調試的屬性創建即使,我似乎無法找到由於該類型是homeAddress或招聘人數的父類的任何引用。

回答

1

根據花人的建議,我能夠想出下面這似乎工作。我簡單地修改在customValidation.js文件中的以下:

jQuery.validator.addMethod("requiredif", function (value, element, params) { 
    if ($(element).val() != '') return true; 
    var prefix = getModelPrefix(element.name); // NEW LINE 
    var $other = $('#' + prefix + params.other); // MODIFIED LINE 
    var otherVal = ($other.attr('type').toUpperCase() == "CHECKBOX") ? ($other.attr("checked") ? "true" : "false") : $other.val(); 
    return params.comp == 'isequalto' ? (otherVal != params.value) : (otherVal == params.value); 
}); 

我還增加了以下方法,以該文件(JQuery的塊內,以便僅專用可訪問):

function getModelPrefix(fieldName) { 
    return fieldName.substr(0, fieldName.lastIndexOf(".") + 1).replace(".","_"); 
} 
1

現在不能完全做到這一點,但問題出在客戶端javascript函數中:

jQuery.validator.addMethod(「requiredif」 ......

JS的不夠尖端,以應對複雜的視圖模型,其中可能有型號前綴。如果你看看微軟的jquery.validate.unobstrusive.js(在每個MVC3應用程序的腳本文件夾中),你會發現一些有用的方法,包括getModelPrefix和appendModelPrefix。您可以採取類似的方法並更改requiredIf驗證方法 - 查看jquery.validate.unobstrusive.js中的equalto方法以獲得幫助。

+0

感謝信息。我看到MS在jquery.validate.unobstrusive.js中使用的函數,但我不太清楚如何在我的JS文件中實現它們。如果你有機會,任何幫助將不勝感激,否則,我會繼續玩弄弄清楚。 – bigmac 2012-04-19 22:55:17

相關問題