我有一个支持多个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。 –