我可以将MVC 2 DataAnnotation属性添加到现有属性吗?

时间:2009-12-10 16:49:31

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

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

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

2 个答案:

答案 0 :(得分:6)

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

[MetadataType(typeof(MyModelMetadata))]
public partial class OriginalMyModel
{
}

public class MyModelMetadata
{
    [Required]
    public string MyProperty;  

    // ...
}

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

答案 1 :(得分:2)

您可以在班级上使用MetadataType属性:

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

实际上,我已经看到元数据经常与生成的模型不同步,这可能会导致一些令人头疼的问题。您可能希望查看备用验证机制而不是数据注释。

我一直在使用Fluent Validation,这很容易上手并开始使用。在Fluent Validation 2.0(仍在测试阶段)中,甚至可以对xVal集成部分进行Fluent验证,您可以将其引入项目进行客户端验证。

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

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