使用数据注释进行模型validation的错误消息
鉴于以下类别:
using System.ComponentModel.DataAnnotations; public class Book{ public Contact PrimaryContact{get; set;} public Contact SecondaryContact{get; set;} [Required(ErrorMessage="Book name is required")] public string Name{get; set;} } public class Contact{ [Required(ErrorMessage="Name is required")] public string Name{get; set;} }
有没有一种干净的方法我可以使用DataAnnotations
为Book
每个Contact
实例提供明确的错误消息? 例如,如果PrimaryContact
实例中缺少名称,则错误将显示为“需要主要联系人姓名”。
我目前的解决方案是创建一个validation服务,检查模型状态是否存在字段错误,然后删除所述错误并使用我想要的特定语言将其添加回来。
这是我所知道的唯一方式,但它远非干净。 它涉及使用子类和MetaData类来“覆盖”错误消息。
public class Book { public PrimaryContact PrimaryContact { get; set; } public SecondaryContact SecondaryContact { get; set; } [Required(ErrorMessage = "Book name is required")] public string Name { get; set; } } public class Contact { [Required(ErrorMessage = "Name is required")] public string Name { get; set; } } [MetadataType(typeof(PrimaryContactMD))] public class PrimaryContact : Contact { class PrimaryContactMD { [Required(ErrorMessage = "Primary Contact Name is required")] public string Name { get; set; } } } [MetadataType(typeof(SecondaryContactMD))] public class SecondaryContact : Contact { class SecondaryContactMD { [Required(ErrorMessage = "Secondary Contact Name is required")] public string Name { get; set; } } }
我知道这是旧的,但是为了帮助遇到这个问题的其他人并且像我一样偶然发现这个问题,你可能想要看看为这些属性使用CustomValidation
属性而不是依赖于Required
属性。
CustomValidation
将允许您更精细地定制validation消息到您正在validation的属性。 我已经使用了context.DisplayName
来动态显示正在validation的属性的名称,只是为了简洁,但这可以根据您的需要进一步自定义。
如果需要进一步自定义,您可以为每个单独的属性编写不同的CustomValidation
处理程序,而不是像我在代码示例中那样重复使用相同的处理程序。
using System.ComponentModel.DataAnnotations; public class Book { [CustomValidation(typeof(Book), "ValidateContact")] public Contact PrimaryContact { get; set; } [CustomValidation(typeof(Book), "ValidateContact")] public Contact SecondaryContact { get; set; } [Required(ErrorMessage = "Book name is required")] public string Name { get; set; } public static ValidationResult ValidateContact(Contact contact, ValidationContext context) { ValidationResult result = null; if (contact == null) { result = new ValidationResult(string.Format("{0} is required.", context.DisplayName)); } else if (string.IsNullOrWhiteSpace(contact.Name)) { result = new ValidationResult(string.Format("{0} name is required.", context.DisplayName)); } return result; } } public class Contact { [Required(ErrorMessage = "Name is required")] public string Name { get; set; } }
我也在寻找答案,到目前为止我发现了如果你做了类似的事情:“{0}需要联系人姓名”在错误信息中它会自动替换变量的名称。 我认为有一种方法可以明确地使用这个function。
- 在使用MVCContrib对unit testingMVC 3控制器和视图进行unit testing时,向RouteData添加键和值
- 如何在asp.net mvc 3项目中路由.aspx页面?
- ASP.NET MVC:DropDownListFor不选择任何选项
- 如何正确实现其他实体对Identity用户的引用?
- 如何使用“required”htmlattribute向mvc 5 razor视图文本输入编辑器添加自定义错误消息
- 对所有控制器操作强制执行操作筛选(C#/ ASP.NET MVC)
- 发布使用python脚本的MVC应用程序
- asp.net mvc应用程序中的工作单元模式
- 如何在entity framework查询中使用左连接?