0

我希望能夠從控制器動作中動態添加ModelClientValidationRule。如何在Asp.Net Mvc 3中動態添加自定義客戶端驗證?

例如,基於某些條件,我想確定是否應該呈現客戶端驗證。不過,我不想全力以赴,通過在全局級覆蓋驗證提供程序來在所有控制器上添加此自定義規則。

如果這是一個服務器端驗證我會做這樣的事情,但相反,我想在渲染前綁定客戶端驗證 - 我不知道如何。

public ActionResult DoSomething(){ 
    ModelState["SomePropertyKey"].Errors.Add(...) 
} 

我在尋找的祕密武器,將做到這一點:

public ActionResult RenderSomething(){ 
    if(IsSomeCondition){ 
     <<Secret Sauce To Render the View with "X" ModelClientValidationRule>> 
    } 
} 

我可以全力以赴,完全規避了框架,但我更喜歡在它的工作儘可能多地。

請幫忙。

回答

0

我不確定要理解你的問題,因爲你的第二個代碼片段顯然是服務器端代碼,而你正在談論某種客戶端方式來實現某些功能。爲什麼不根據您的情況向您的ModelState添加錯誤?或者,也許你可以澄清你的問題,幫助我瞭解你的需求。

+0

成功的第二個密碼是服務器端渲染期間稱爲,之前發佈。我需要根據一定的條件打包客戶端驗證。我沒有看到任何直接的做法。 – Alwyn 2012-03-15 01:41:34

0

如果您要求,對於給定的ViewModel,我希望名稱中帶有單詞Phone的所有字符串屬性都具有特定的驗證,您可以使用T4模板生成具有相應驗證屬性和數據註釋的部分類。

您也可以編寫自定義驗證來擴展jQuery驗證,以便您的客戶端可以執行此操作而不是服務器。

如果您問我如何在全球範圍內應用業務規則,您可以考慮製作自己的基礎控制器,以實現OnActionExecuting或視圖渲染生命週期中的半打方法之一。或者實現一個ActionFilterAttribute,它或多或少地做同樣的事情,但會給予更多的靈活性。

如果您嘗試這樣做是阻止A公司的用戶對公司B的數據執行操作,那麼您可以編寫ActionFilterAttribute,或者您可以通過編寫一個位於管道中的HttpModule來實現,永遠不要讓這種情況發生,無論你的web應用程序中發生了什麼。如果你只使用存儲過程來編輯數據,你也可以在數據庫中實現這種事情。

鑑於你不清楚'特殊醬',我只能說這樣做沒有特別的規定。這個重要的事情是考慮應用規則的最佳效果。

+0

讓我說清楚。我需要在控制器行動級別發生這種情況。或者至少在ActionFilter上。因此,根據一些條件,我想注入自定義客戶端驗證。現在我可以全力以赴建立我自己的框架。將腳本放入viewbag中,將它們綁定到表單等,並通過jquery onload執行它們。但是,這是重新發明輪子。如果可能的話,Mvc有一個我想要插入的機制。 – Alwyn 2012-03-15 04:41:59

2

這是控制器操作內部的要求嗎?如果沒有,一個選項是實施你自己的ModelValidatorProvider

public class DynamicModelValidatorProvider : ModelValidatorProvider 
{ 
    public IEnumerable<ModelValidator> GetValidators(
     ModelMetadata metadata, 
     ControllerContext context) 
    { 
     // do your logic here, based off metadata or controllercontext. 
     // you could return common DataAnnotation type validators 
     return new RequiredAttributeAdapter(metadata, context, new RequiredAttribute()); 

     // or maybe your own custom validator? 
    } 
} 

並在您的全球。ASAX

ModelValidatorProviders.Providers.Add(new DynamicModelValidatorProvider()); 

如果你不感興趣的東西服務器端在所有的,實現自己的自定義ModelValidator具有堅固GetClientValidationRules()方法,但始終返回Validate()

+0

是的,我不得不說這是所有答案中最接近的。我考慮過這一點,但這不足以滿足我的需要。驗證必須是動態的,因爲它涉及相當多的業務邏輯。我可以讓它進行服務器端/遠程驗證,但用戶需要響應。 – Alwyn 2012-03-15 04:38:02

相關問題