如何在模型和视图模型之间同步数据注释

时间:2013-05-31 13:58:11

标签: asp.net-mvc-3 ef-code-first data-annotations

我正在使用EF Code First,因此我的数据注释正在推动我的SQL服务器数据库列定义/属性(即[StringLength(30)] = nvarchar(30)等)。我正在使用ViewModels来推动我的观点。如何在ModelsViewModels之间同步数据注释?

例如,我有以下实体类:

public class Ticket
{
    ...
    [Required]
    [DataType(DataType.Currency)]
    [DisplayFormat(DataFormatString = "{0:C}")]
    public double TicketBalance { get; set; }
    ...
}

ViewModel使用Model类中相同的属性:

public class EditTicketViewModel
{
    ...
    [Required]
    [DataType(DataType.Currency)]
    [DisplayFormat(DataFormatString = "{0:C}")]
    public double TicketBalance { get; set; }
    ...
}

如何同步这两个数据注释?

2 个答案:

答案 0 :(得分:1)

虽然您无法在运行时更改ViewModels上的属性,但您可以在某种程度上模拟它们以进行验证(这可能是您使用数据注释的原因)。

这需要使用AutoMapperEmitMapper等对象映射器创建ViewModels。然后,您可以挂钩到映射过程的适当部分,以更新MVC在验证过程的各个部分中使用的DataAnnotationsModelMetadataProviderDataAnnotationsModelValidatorProvider

This answer显示了使用AutoMapper执行此操作的方法。我现在正在寻找使用EmitMapper的解决方案,因为执行起来要快一些。

答案 1 :(得分:0)

两者之间没有同步。虽然它们看起来很相似,但它们实际上是不同的:一个用于数据库,另一个用于GUI。

  • 对于数据库,您主要要测试[Required][StringLength(XXX)]。有时也[DataType]

  • 对于GUI,您要检查除格式,正则表达式,范围等之外的那些。

有验证属性,显示属性,数据建模属性。根据情况在正确的位置选择正确的属性类别。

当你开始使用诸如jQuery验证或KnockoutJS验证之类的东西时,它会变得更糟。在这种情况下,您将不得不第三次重复您的努力以达到JS的目的。不幸的是

您还可以查看其他人在此处执行的操作:How do I remain DRY with asp.net mvc view models & data annotation attributes?

人们使用继承。这很好,但有些令人困惑,而你让其他人稍后阅读你的代码。

好的建议是根据上面链接中的一个响应从数据注释切换到fluent validation。它允许您将相同的验证类应用于多个模型。

希望这有帮助。