4

首先,我不得不說我明白基於數據註解的模型驗證如何在ASP.NET MVC4中工作,並且我已使用DataAnnotationsModelValidatorProvider成功實現了它。所以我不需要幫助來設置它。ASP.NET MVC模型驗證錯誤本地化上下文

但是,當它歸結爲HtmlHelpers,我努力想弄清錯誤信息的上下文。通過說context,我的意思是我們正在談論哪個錯誤。哪個屬性返回錯誤?

我能得到的是Key錯誤和當前ErrorMessage,但在編程上,沒有什麼,至少我知道,這將溝通我們正在談論的錯誤。無論是Required屬性還是其他屬性,我都無法找到如何區分它們的方法。

讓我們稍微打開場景。我有自定義HtmlHelpers呈現ContentEditable元素。例如Html.ContentEditableValidationMessageFor(m => m.firstName);。它會輸出這樣的事情:

<span contenteditable="true" data-valmsg-for="firstName" data-valmsg-replace="Please provide first name" class="field-validation-error">Please provide first name</span> 

現在,我有一個jQuery插件來處理,並堅持在contenteditable元素的變化,它會堅持他們到後端。但是,UI沒有任何可以說明我們正在討論的錯誤消息。人類可以很容易地看到它是RequiredAttribute,但在編程上沒有數據可以將它與某些MinLengthAttribute區分開來。

在這種情況下,如果我只是簡單地使用data-valmsg-for="firstName"作爲本地化的關鍵字,那麼將返回相同的屬性的所有錯誤相同的錯誤消息。

圓起來

什麼是最好的實踐中,當ModelState是可用的,爲:發射ModelError一個唯一的ID?考慮到我使用ASP.NET MVC4和DataAnnotationsModelValidatorProvider

我可以想出很多方法來「一起攻擊」,但我想使用ModelState以及任何MVC提供的方法。如果這一切都歸結爲編寫一個自定義ModelValidatorProvider,那麼我都爲它打開。只要它是最好和最可持續的方式去實現它。我所有的做更多和更少的後來盜號的現在和黑客它永遠保持它的工作

+0

這對我來說是一個非常有趣的問題。你使用反射技術的基礎是什麼?和你一樣,「你可以通過反思來做到這一點」通常意味着爲自己設置一些代碼,這些代碼不可避免地會被維護得不好。將密切關注這一個... – 2013-04-05 20:40:21

+0

你想在客戶端或服務器端的數據? – Jared 2013-04-08 21:00:57

+0

您的進度有何更新? – 2013-04-09 08:06:07

回答

4

你能給各地要知道哪些規則引發驗證錯誤某些情況下,它可能是你試圖做一些你不應該做的事情的例子嗎?

一般來說,我使用FluentValidation(http://fluentvalidation.codeplex.com/wikipage?title=mvc)代替Data Annotation驗證,其原因很多,可以使用混合模型和單元測試驗證邏輯,從而實現包含業務邏輯的更復雜的驗證。如果您可以免費使用第三方庫,我會給它一個看看,因爲它一直解決我以前遇到的任何驗證問題。

它可以讓你編寫處理你的模型驗證通過流利的API的C#代碼。它有一個MVC擴展,它爲您提供了一切,因此除了創建模型驗證類之外,其後的影響不大。上面的代碼片段的例子是...

RuleFor(modelname => modelname.FirstName).NotEmpty().WithMessage("lease provide first name"); 
2

即使實施ModelValidatorProvider不會幫助,它只是一個機制,提供基於模型元ModelValidator秒。在模型綁定過程中,在調用動作ModelValidator s時,結果僅爲ModelValidationResult,其中僅包含MemberName和文本Message

我認爲是要找出一個骯髒的方式,其ModelValidator通過檢查類似這樣的錯誤信息失敗:

var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors}); 

通過在modelErrors每個鍵對,你可以找到ValidatorProvider錯誤信息檢查錯誤的的ErrorMessage出錯屬於哪個Validator。

+1

謝謝。但是我已經通過反射使用了一種骯髒的方式來獲取Model屬性的任何ValidationAttributes進行驗證。它正在尋找與當前在ModelState中填充相同的errorMessage的屬性的ErrorResourceKey。這樣我可以連接屬性名稱和錯誤資源鍵以獲取屬性錯誤的唯一鍵。 – 2013-04-09 20:37:30