說我有一個自定義的驗證屬性ValidateFooIsCompatibleWith
模型像這樣:如何爲模型上的複雜類型添加自定義ClientValidationRules(不顯眼的驗證)?
public class FooPart
{
public string Foo { get; set; }
public string Eey { get; set; }
}
public class FooableViewModel
{
public FooPart Foo1 { get; set; }
[ValidateFooIsCompatibleWith("Foo1")]
public FooPart Foo2 { get; set; }
}
比方說,我也有FooPart
定義的自定義EditorTemplates:
@Html.TextBoxFor(m => m.Foo)
@Html.TextBoxFor(m => m.Eey)
這樣我的看法基本上是:
@Html.EditorFor(m => m.Foo1)
@Html.EditorFor(m => m.Foo2)
服務器端,驗證工作正常。但是,無論我嘗試什麼,我都無法獲取呈現的html來添加規則。
如果我執行IClientValidatable
,事實證明GetClientValidationRules()
永遠不會被調用。 (我之前成功使用了IClientValidatable
以及「簡單」字段)。
我也嘗試通過繼承DataAnnotationsModelValidator<TAttribute>
註冊我自己的自定義適配器,並在global.asax
中註冊DataAnnotationsModelValidatorProvider.RegisterAdapter(...)
該方法也無法調用GetClientValidationRules()
。
** **更新 如果同時添加自定義ModelMetadataProvider
和一個自定義ModelValidatorProvider
,這樣我可以設置斷點,我注意到行爲的一個有趣的一點:
- 的請求到
ModelMetadataProvider
作出的元數據與ContainerType
的FooableViewModel
和ModelType
的FooPart
。然而,ModelValidatorProvider
沒有相應的請求,所以我不能在那裏插入我的自定義客戶端驗證規則。 - 請求到
ModelValidatorProvider
由具有的FooPart
一個ContainerType
和string
兩者的Foo
和Eey
性質的ModelType
。但在這個級別上,我不知道應用於屬性的屬性。
我該如何獲得MVC框架來爲複雜類型註冊自定義客戶端驗證規則?
不幸的是,在'FooPart'的EditorTemplate中,我需要應用基於屬性驗證的驗證 - 例如在問題的例子中,'FooPart'的編輯器模板有時需要添加客戶端驗證規則,例如'ValidateFooIsCompatibleWith'(使用jquery不顯眼的驗證),有時不會。所以jquery驗證器是解決方案的一部分,但我不認爲這解決了我的根本問題。 – Nathan
我想我不明白你的問題,因爲你使用服務器發送驗證規則給客戶端,而不是通過JS或JQuery來處理客戶端驗證。你嘗試過'CustomValidationAttribute'嗎? – stink