我正在使用EF Code First,因此我的数据注释正在推动我的SQL服务器数据库列定义/属性(即[StringLength(30)]
= nvarchar(30)
等)。我正在使用ViewModels
来推动我的观点。如何在Models
和ViewModels
之间同步数据注释?
例如,我有以下实体类:
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; }
...
}
如何同步这两个数据注释?
答案 0 :(得分:1)
虽然您无法在运行时更改ViewModels
上的属性,但您可以在某种程度上模拟它们以进行验证(这可能是您使用数据注释的原因)。
这需要使用AutoMapper或EmitMapper等对象映射器创建ViewModels
。然后,您可以挂钩到映射过程的适当部分,以更新MVC在验证过程的各个部分中使用的DataAnnotationsModelMetadataProvider
和DataAnnotationsModelValidatorProvider
。
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。它允许您将相同的验证类应用于多个模型。
希望这有帮助。