【问题标题】:Can I add MVC 2 DataAnnotation attributes to existing properties?我可以将 MVC 2 DataAnnotation 属性添加到现有属性吗?
【发布时间】:2009-12-10 16:49:30
【问题描述】:

我正在使用生成的类作为模型,我希望将 DataAnnotation 属性添加到它的某些属性中。由于它是生成的代码,我不想直接添加注释。还有其他方法可以将它们附加到属性上吗?

我考虑过让模型成为接口,并使用部分类来让生成的类订阅它。是否有一个不太复杂的解决方案,假设它甚至可以工作?

【问题讨论】:

    标签: c# validation asp.net-mvc-2 data-annotations generated-code


    【解决方案1】:

    是的,有。您必须创建与原始模型具有相同属性的元数据类,并使用 MetadataType 属性将其连接到您的模型:

    [MetadataType(typeof(MyModelMetadata))]
    public partial class OriginalMyModel
    {
    }
    
    public class MyModelMetadata
    {
        [Required]
        public string MyProperty;  
    
        // ...
    }
    

    在上面的示例中,OriginalModel 是您正确的模型类,而 MyModelMetadata 是仅用于注释属性的类。 MyModelMetadata 应该具有与您的模型相同的属性。

    【讨论】:

    • 您可能希望使用公共类部分 MyModelMetadata,因为您经常将部分目标定位在 Entity Framework/LINQ to SQL 上......即使不将代码单独归因也很好。
    • 谢谢。这正是我正在寻找的。我也可以这样做以向生成的类添加序列化属性吗?还是特定于 MVC?当你说 hte 元数据类应该具有相同的属性时,这是否意味着它必须具有全部?还是说我使用的属性只需要排队?
    • DataAnnotation 属性完全独立于 MVC。它们只是管理验证的众多方法之一,MVC2 默认模型绑定器默认使用它们。元数据类不必具有所有模型属性——只需要那些需要注释的。序列化属性是什么意思?
    • 数据成员,例如。感谢您的回答。
    【解决方案2】:

    你可以在你的类上使用 MetadataType 属性:

    http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

    不过,在实践中,我经常看到元数据与生成的模型不同步,这可能会导致一些令人头疼的问题。您可能想研究一种替代验证机制,而不是数据注释。

    我一直在使用Fluent Validation,它很容易上手并开始使用。 Fluent Validation 2.0(仍处于测试阶段)中甚至还有一个 Fluent Validation to xVal 集成块,您可以将其引入您的项目以进行客户端验证。

    Fluent Validation 允许您在单独的类中定义您的验证。您需要做的就是向生成的类添加一个属性,告诉它使用什么验证器,这可以通过部分类来完成。

    或者,您可以创建从包含数据注释的域模型映射到的特定于视图的模型。在这种情况下,使用AutoMapper 之类的东西来简化来回映射。然后,如果您的域模型发生变化,您会得到与元数据方法相比的编译时错误。

    【讨论】:

    • DataAnnotationValidators 非常灵活,几乎是 .NET 的内置验证框架。有很多非常好的验证技术,例如 xVal 等,但我偏爱使用它们,尤其是与 ASP.NET MVC 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多