我使用 RIA 服务与 LinqToEntitiesDomainService<> 和 Silverlight 5 Beta 在客户端生成 DomainContext 代码。我的模型/实体中有数据注释来进行基本验证,当直接使用模型时,DataForm 等控件执行开箱即用的验证。但是我将我的模型包装在一个 ViewModel 中,所以我失去了所有的自动验证。这是一个简化的示例:
// In DataModel assembly, regenerated on the client side by RIA Services
public class PetModel
{
[Required]
public string Name { get; set; }
}
// Only on the client side
public class PetViewmodel
{
private PetModel _model;
public PetViewmodel(PetModel model)
{
_model = model;
}
public string Name
{
get { return _model.Name; }
set { _model.Name = value; }
}
}
我的问题是:如何确保在客户端不复制 ViewModel 中的所有注释的情况下Name
考虑这一点?Required
(将来我可能不得不将这些实体与不同的 ViewModel 一起使用——我想保留相同的注释)
我想到了手动将MetadataType
属性添加到 ViewModel 中,指向 Model 类型:
[MetadataType(typeof(PetModel))]
public class PetViewmodel
{
...
}
但MetadataTypeAttribute
很遗憾,在 Silverlight 5 版本的System.ComponentModel.DataAnnotations
.
编辑:澄清 - 我的实体的元数据包含在具有嵌套类的实体中。我手动编码这个类,因为我的 L2E 模型在一个单独的程序集中,所以 DomainService 向导不会为我生成它。
[MetadataType(typeof(Metadata))]
public partial class PetModel
{
[Required]
public string Name { get; set; }
public class Metadata
{
[Required]
public string Name { get; set; }
}
}
如果我理解正确,这应该正是向导生成元数据的方式。RIA 服务代码生成器在客户端代码中生成正确的数据注释,因此它可以正确地提取它。