IaC*_*der 21 c# validation asp.net-mvc annotations data-annotations
鉴于以下课程:
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;}
}
Run Code Online (Sandbox Code Playgroud)
有没有干净的方式我可以给每个实例的不同错误信息Contact
中Book
使用DataAnnotations
?例如,如果PrimaryContact
实例中缺少名称,则错误将显示为"需要主要联系人姓名".
我目前的解决方案是创建一个验证服务,检查模型状态是否存在字段错误,然后删除所述错误并使用我喜欢的特定语言将其添加回来.
Jab*_*Jab 39
这是我所知道的唯一方式,但它远非干净.它涉及使用子类和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; }
}
}
Run Code Online (Sandbox Code Playgroud)
syn*_*tik 11
我知道这是旧的,但为了帮助遇到这个问题的其他人并像我一样偶然发现这个问题,你可能想看看使用这个CustomValidation
属性的属性而不是依赖于Required
属性.
CustomValidation
将允许您更精细地定制验证消息到您正在验证的属性.我过去常常context.DisplayName
为了简洁而动态显示正在验证的属性的名称,但这可以根据您的需要进一步定制.
如果需要进一步的自定义,您可以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; }
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
62318 次 |
最近记录: |