4

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

例如,我有以下实体类:

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

以及ViewModel使用类中相同属性的a Model

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

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

4

2 回答 2

2

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

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

这个答案显示了一种使用 AutoMapper 的方法。我目前正在寻找使用 EmitMapper 的解决方案,因为它执行起来更快一些。

于 2014-07-11T10:55:21.873 回答
1

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

  • 对于您主要要测试的数据库[Required][StringLength(XXX)]. 有时[DataType]也是如此。

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

有验证属性、显示属性、数据建模属性。根据情况在合适的地方选择合适的属性类别。

当您开始使用 jQuery 验证或 KnockoutJS 验证之类的东西时,情况会变得更糟。在这种情况下,您将不得不为 JS 目的第三次重复您的工作。很遗憾。

您还可以在这里查看其他人做了什么:如何使用 asp.net mvc 视图模型和数据注释属性保持干燥?

人们使用继承。这很好,但是当您让其他人稍后阅读您的代码时会有点混乱。

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

希望这可以帮助。

于 2013-05-31T19:03:08.407 回答