我有一個支持多個ASP.NET MVC Web應用程序的實體框架4.1模型。我使用DataAnnotations來定義和本地化標籤文本和驗證規則以及錯誤消息。如何覆蓋實體框架驗證錯誤消息
對於某些應用程序,我需要某些字段的標籤文本與標準的模型定義文本不同。標籤本身很容易實現:我從與視圖關聯的本地資源文件中檢索我需要的文本。但是,標籤文本也用於驗證錯誤消息,如「{fieldname}必須具有50個字符的最大長度」。
在不改變模型類的註解的情況下更改驗證消息的最佳方式是什麼?
我有一個支持多個ASP.NET MVC Web應用程序的實體框架4.1模型。我使用DataAnnotations來定義和本地化標籤文本和驗證規則以及錯誤消息。如何覆蓋實體框架驗證錯誤消息
對於某些應用程序,我需要某些字段的標籤文本與標準的模型定義文本不同。標籤本身很容易實現:我從與視圖關聯的本地資源文件中檢索我需要的文本。但是,標籤文本也用於驗證錯誤消息,如「{fieldname}必須具有50個字符的最大長度」。
在不改變模型類的註解的情況下更改驗證消息的最佳方式是什麼?
您已將您的驗證耦合到您的實體模型。避免這種情況的方法是從您的實體創建視圖模型,並將驗證放在這些視圖模型上。
例如:如果你有實體...
public class Product
{
public string Name {get; set;}
}
可以創建兩個不同的視圖模型:
public class ProductPageViewModel1
{
[Required]
public string Name {get; set;}
}
public class ProductPageViewModel2
{
[DisplayName("Foo")]
public string Name {get; set;}
}
實體映射到視圖模型和使用這些在你的意見。
企圖重新定義錯誤消息,在控制器的特殊情況下,像這樣:
型號:
public class Company
{
[Required(ErrorMessage = "The field is required")]
public string CompanyName { get; set; }
public string Address { get; set; }
}
控制器:
[HttpPost]
public ActionResult Index(Company company)
{
if(ModelState.IsValid)
{
//your code
}
// your custom validation message here
if (ModelState["CompanyName"].Errors.Any())
ModelState["CompanyName"].Errors[0] = new ModelError("custom error message");
return View();
}
這也有幫助,謝謝。我看到的唯一缺點是它將驗證代碼放在特定的控制器方法中,使其很難跨多個相關視圖重用。 –
,肯定會做到這一點,但它意味着編寫視圖每個視圖的模型,以及映射方法以從實體模型中填充視圖模型。從這個角度來看,這似乎是一個昂貴的解決方案。我希望找到一個更簡單的方法,可能是一個HtmlHelper,它操縱模型元數據來改變驗證消息。 –
也許是短期的昂貴,但如果你計劃擴展你的應用程序,我認爲這是一個很好的投資。而且它將會比一些神奇的反射代碼更具可讀性:)。你可以使用像Automapper這樣的東西來緩解映射。 這是一篇很好的文章,解釋了使用視圖模型的其他優點:http://stackoverflow.com/a/4878956 – Dan
嗯。你讓我思考,我可以看到好處。將檢查出Automapper。 –