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

这也有帮助,谢谢。我看到的唯一缺点是它将验证代码放在特定的控制器方法中,使其很难跨多个相关视图重用。 –