首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataAnnotation属性伙伴类陌生性- ASP.NET MVC

DataAnnotation属性伙伴类陌生性- ASP.NET MVC
EN

Stack Overflow用户
提问于 2010-05-27 10:10:13
回答 2查看 2.3K关注 0票数 4

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

代码语言:javascript
复制
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”)。

因此,我们手动创建此伙伴类,以添加无法自动生成的自定义属性:

代码语言:javascript
复制
[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是一个简单的基于正则表达式的属性,仅允许数字和连字符:

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

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

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

但是伙伴类中的NumberCode属性甚至不会应用于AccountNumber属性:

代码语言:javascript
复制
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继承了继承ValidationAttribute的RegularExpressionAttribute,所以它应该在那里。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2010-06-23 03:27:17

我使用VS2008和MVC2重新创建了您的代码,它对我来说工作得很好。

票数 1
EN

Stack Overflow用户

发布于 2010-06-30 00:36:20

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2918058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档