c# - DataAnnotation 属性好友类陌生 - ASP.NET MVC

标签 c# asp.net-mvc attributes data-annotations buddy-class

鉴于这个由 EntityFramework T4 模板自动生成的 POCO 类(没有也不能以任何方式手动编辑):

public partial class Customer
{
    [Required]
    [StringLength(20, ErrorMessage = "Customer Number - Please enter no more than 20 characters.")]
    [DisplayName("Customer Number")]
    public virtual string CustomerNumber { get;set; }

    [Required]
    [StringLength(10, ErrorMessage = "ACNumber - Please enter no more than 10 characters.")]
    [DisplayName("ACNumber")]
    public virtual string ACNumber{ get;set; }
}

请注意,“ACNumber”是一个错误命名的数据库字段,因此自动生成器无法生成正确的显示名称和错误消息,应该是“Account Number”。

所以我们手动创建这个伙伴类来添加无法自动生成的自定义属性:

[MetadataType(typeof(CustomerAnnotations))]
public partial class Customer { }

public class CustomerAnnotations
{
    [NumberCode] // This line does not work
    public virtual string CustomerNumber { get;set; }

    [StringLength(10, ErrorMessage = "Account Number - Please enter no more than 10 characters.")]
    [DisplayName("Account Number")]
    public virtual string ACNumber { get;set; }
}

其中 [NumberCode] 是一个简单的基于正则表达式的属性,它只允许数字和连字符:

[AttributeUsage(AttributeTargets.Property)]
public class NumberCodeAttribute: RegularExpressionAttribute
{
    private const string REGX = @"^[0-9-]+$"; 
    public NumberCodeAttribute() : base(REGX) { }
}

现在,当我加载页面时,DisplayName 属性正常工作 - 它显示伙伴类的显示名称,而不是生成的类。

StringLength 属性无法正常工作 - 它显示来自生成类的错误消息(“ACNumber”而不是“帐号”)。

但是好友类中的 [NumberCode] 属性甚至没有应用到 AccountNumber 属性:

foreach (ValidationAttribute attrib in prop.Attributes.OfType<ValidationAttribute>())
{
    // This collection correctly contains all the [Required], [StringLength] attributes
    // BUT does not contain the [NumberCode] attribute
    ApplyValidation(generator, attrib);
}

为什么 prop.Attributes.OfType<ValidationAttribute>()集合不包含 [NumberCode] 属性? NumberCode 继承了 RegularExpressionAttribute,它继承了 ValidationAttribute,所以它应该在那里。

如果我手动将 [NumberCode] 属性移动到自动生成的类,那么它会包含在 prop.Attributes.OfType<ValidationAttribute>() 中收藏。

所以我不明白的是为什么这个特定的属性在伙伴类中不起作用,而伙伴类中的其他属性却起作用。以及为什么这个属性在自动生成的类中有效,但在伙伴中无效。有什么想法吗?

另外,为什么 DisplayName 会被伙伴覆盖,而 StringLength 不会?

最佳答案

我注意到您的 NumberCodeAttribute 没有在 AttributeUsage 属性中指定 AllowMultiple=True。该参数的默认值(如果未指定)为 false。尝试添加它,它应该会出现。

关于c# - DataAnnotation 属性好友类陌生 - ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2918058/

相关文章:

asp.net-mvc - ASP.Net Html.DropDownList 未选择所选元素

c# - WPF 数据绑定(bind) - "Custom Type Descriptor"示例

MVC 身份验证超时/ session cookie 删除后的 Ajax 请求

jquery - 如何在菜单上显示徽章

attributes - 通过 PHP 代码添加 WooCommerce 属性

c# - 如何获取我们的属性设置的属性名称?

jquery - jquery根据属性值隐藏元素

c# - 颜色.FromArgb(...);安全信息

C# WebClient 使用 Async/Await 并行调用 API

c# - 如何检查是否已安装 IIS 6 Management Compatibility 功能?