我更喜歡使用Fluent API配置到DataAnnotation,因爲我想將模型與數據訪問分開。如何使Fluent API配置與MVC客戶端驗證一起工作?
我已經嘗試在MVC中,Fluent API不能與客戶端驗證一起使用。簡而言之,是否有一種簡單的方法可以使Fluent API與DataAnnotation可以執行的客戶端驗證一起工作?
我更喜歡使用Fluent API配置到DataAnnotation,因爲我想將模型與數據訪問分開。如何使Fluent API配置與MVC客戶端驗證一起工作?
我已經嘗試在MVC中,Fluent API不能與客戶端驗證一起使用。簡而言之,是否有一種簡單的方法可以使Fluent API與DataAnnotation可以執行的客戶端驗證一起工作?
No. Fluent API只是映射 - 正確的。數據註釋既是映射也是驗證 - 錯誤的。數據註釋首先是EF代碼最糟糕的特性之一,因爲使用這種方式時,他們將持久性與表示和驗證邏輯耦合在一起。
建議:不要使用EF實體進行演示。使用具有數據註釋的特殊視圖模型,並讓您的控制器從實體準備視圖模型,反之亦然。不久或稍後,您會發現您的驗證與您的映射不是1:1,或者您的視圖需要比實體類型中提供的數據更多或更少的數據。使用視圖模型,這些情況將由他們處理。
我今天掙扎了一段時間,這不是嚴格的客戶端驗證,因爲它需要往返,但它確實可以讓您受益於標準模板中的驗證摘要和消息幫助程序。在您的控制器的操作方法,你只需換你SaveChanges()
呼叫嘗試 - 漁獲物和所產生的錯誤添加到ModelState
如下:
try {
//This does not pick up fluent validation failures
if (ModelState.IsValid) {
db.Entity.Add(entity);
db.SaveChanges();
//Users want to create loads of my entities without seeing the index...
return RedirectToAction("Create");
}
} catch (DbEntityValidationException e) {
//Log errors
foreach (var result in e.EntityValidationErrors) {
foreach(var error in result.ValidationErrors){
ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
}
}
//return to view with current model + validation errors
return View(entity)
這當然需要更多的工作,如果你在這裏保存多個實體。
使用視圖模型對象作爲拉吉斯拉夫建議是正確的做法。當然,可是,我卻用它來支持要求提前了下游的系統集成測試的測試UI ...
爲什麼EF甚至需要映射如「HasMaxLength」?如果該值較長,SQL服務器會在嘗試寫入時拒絕它,並且讀取無關緊要,因爲'string'類型沒有長度限制。那麼這個映射實際上是什麼? – 2014-02-17 10:05:38
我知道這是一個古老的問題,但認爲我會爲未來的讀者添加。一個原因是,如果您先使用代碼來創建數據庫,那麼流暢的api /數據註釋將用於構建create table語句,並且需要知道所需的長度等。 – Kate 2015-10-19 19:32:45