0

我有一個支持多個ASP.NET MVC Web應用程序的實體框架4.1模型。我使用DataAnnotations來定義和本地化標籤文本和驗證規則以及錯誤消息。如何覆蓋實體框架驗證錯誤消息

對於某些應用程序,我需要某些字段的標籤文本與標準的模型定義文本不同。標籤本身很容易實現:我從與視圖關聯的本地資源文件中檢索我需要的文本。但是,標籤文本也用於驗證錯誤消息,如「{fieldname}必須具有50個字符的最大長度」。

在不改變模型類的註解的情況下更改驗證消息的最佳方式是什麼?

回答

1

您已將您的驗證耦合到您的實體模型。避免這種情況的方法是從您的實體創建視圖模型,並將驗證放在這些視圖模型上。

例如:如果你有實體...

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;} 

}

實體映射到視圖模型和使用這些在你的意見。

+0

,肯定會做到這一點,但它意味着編寫視圖每個視圖的模型,以及映射方法以從實體模型中填充視圖模型。從這個角度來看,這似乎是一個昂貴的解決方案。我希望找到一個更簡單的方法,可能是一個HtmlHelper,它操縱模型元數據來改變驗證消息。 –

+0

也許是短期的昂貴,但如果你計劃擴展你的應用程序,我認爲這是一個很好的投資。而且它將會比一些神奇的反射代碼更具可讀性:)。你可以使用像Automapper這樣的東西來緩解映射。 這是一篇很好的文章,解釋了使用視圖模型的其他優點:http://stackoverflow.com/a/4878956 – Dan

+0

嗯。你讓我思考,我可以看到好處。將檢查出Automapper。 –

1

企圖重新定義錯誤消息,在控制器的特殊情況下,像這樣:

型號:

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(); 
     } 
+0

這也有幫助,謝謝。我看到的唯一缺點是它將驗證代碼放在特定的控制器方法中,使其很難跨多個相關視圖重用。 –