2011-05-19 107 views
1

我試圖讓我MVC3應用程序來顯示RequiredIfs的驗證消息,利用這裏的屬性: http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx 現在,如果沒有孩子的實體,但我有一個用戶工作正常,並且用戶地址對象需要驗證。實際上,即使只有一個地址可以工作,但有3個地址,每個地址都有一個複選框,用於指示它是否處於活動狀態。RequiredIf驗證與子實體

我試圖改變validator.unobtrustive.js的jQuery的如下得到驗證上正確的值(地址爲「地址_」或「BillingAddress_」:當所有可能

$.each(this.params, function() { 
        var address = element.name.split('.')[0] + '_'; 
        paramValues[this] = this.toString() == 'dependentproperty' ? address + $element.attr(prefix + this) : $element.attr(prefix + this); 
       }); 

這隻能。一個RequiredIf取決於被選中的複選框下驗證所有addesses並給出輸出視圖上的消息:

$.each(this.params, function() { 
        paramValues[this] = this.toString() == 'dependentproperty' ? 'Address_' + $element.attr(prefix + this) : $element.attr(prefix + this); 
       }); 

任何幫助或想法,爲什麼它是表現這種方式,歡迎=)其他approches解決問題我會開心你接受。謝謝你的幫助。


編輯

我意識到JavaScript的東西不反正工作,我現在已經接到從模型正確的ID。但我仍然有錯誤,它只驗證所有複選框被選中。任何想法,爲什麼這是?

一個地址構建模型如下:

[RequiredIf("IsActive", true)] 
    [Display(Name = UserManagementResources.sdAddressText, ResourceType = typeof(UserManagementResources))] 
    public string Street 
    { 
     get { return _address["sdAddress"]; } 
     set { _address["sdAddress"] = value; } 
    } 

    [RequiredIf("IsActive", true)] 
    [Display(Name = UserManagementResources.sdCityText, ResourceType = typeof(UserManagementResources))] 
    public string City 
    { 
     get { return _address["sdCity"]; } 
     set { _address["sdCity"] = value; } 
    } 

視圖模型包含了不同的地址。

public Address Address 
    { 
     get { return _address ?? (_address = new Address(Customer.Name, _domain, "Address") { IsActive = true }); } 
    } 

    public Address BillingAddress 
    { 
     get { return _billingAddress ?? (_billingAddress = new Address(Customer.Name, _domain, "BillingAddress")); } 
    } 

控制器只是創建一個新的空模型。該視圖使用Html.EditorFor()顯示不同的地址。


+0

您可以發佈您(或簡化)的模型和控制器?我猜測驗證正在阻止創建子對象並因此進行有條件驗證,但我們正在工作中有點盲目。 – Milimetric 2011-05-19 13:37:59

+0

我發佈了模型的主要部分作爲編輯。控制器真的不會做任何事情,除了通過ViewModel ... – Nischo 2011-05-19 13:52:51

回答

1

那麼,我認爲你的公共地址屬性有設置以及獲取(上面沒有顯示)。一種方法是在用戶取消選中「IsActive」時禁用地址編輯表單。然後使用ignore: ':disabled'的jQuery驗證選項,或者如果你隱藏它們,ignore: ':hidden'。看看這個示例,它使用:

http://jsfiddle.net/2EfPZ/21/

從這個問題:

Getting an error when trying to validate fields that depend on another option using jQuery Validate plug-in

+0

非常感謝,這是我需要解決這個問題的想法。不能完全按照這種方式來完成,因爲我並沒有自己生成validate(),而是更改了condition-validation.js來驗證不在隱藏div中的屬性。 – Nischo 2011-05-20 08:34:41

+0

是的,理想情況下,您可以在服務器端進行驗證,以便與您的客戶端一起使用,但請告訴我們您是否知道該代碼部分有什麼問題。 – Milimetric 2011-05-20 17:47:16

+0

服務器端正常工作,沒有任何更改上述代碼。最重要的變化是使用EditorTemplates而不是自己編寫它,然後將conditional-validation.js更改爲以下內容: $ .validator.addMethod('requiredif', 函數(值,元素,參數){0} 0 0 0 var containerId ='#'+ parameters ['dependentproperty'] .span('_')[0]; if($(containerId).css('display')!='none') return $ .validator.methods .required.call(this,value,element,parameters); return true; } ); – Nischo 2011-05-23 08:04:39