我有一个Catalog
EF实体,我在元数据类中装饰如下所示:
public partial class Catalog
{
[Editable(false)]
[Display(ResourceType = typeof(Resources), Name = "ID")]
public string ID { get; set; }
[Required()]
[MaxLength(300)]
[Display(ResourceType = typeof(Resources), Name = "CatalogName")]
public string CatalogName { get; set; }
}
当我将其暴露于Razor视图时,这些值会正确显示。但是,我想要使用视图模型:
public class CatalogViewModel
{
private readonly Catalog _catalog;
// I want the attributes for Catalog.CatalogName to apply here.
public String CatalogName
{
get { return _catalog.CatalogName; }
}
}
我希望能够在视图模型上使用来自实体的验证和显示信息。但是,我无法访问类型Resources
。有没有办法可以以某种方式将这些信息从模型投射到视图模型?
编辑:
业务层验证在实体上注释。我希望保持这种方式,以便验证和显示信息在一个位置。我还为每个视图使用1个视图模型的模式。因此,在这里注释会以我想要避免的方式违反DRY。
答案 0 :(得分:0)
我在使用手动验证的问题中找到了答案。
http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx
它有效,但不是我想要的。
public class CatalogViewModel : IValidatableObject
{
private readonly Catalog _catalog;
public String CatalogName
{
get { return _catalog.CatalogName; }
}
public IEnumerable<ValidationResult> Validate(ValidationContext a_validationContext)
{
// Call Validator.TryValidateObject on _catalog and return results.
}
}
答案 1 :(得分:0)
如果你真的担心违反DRY原则,虽然我不确定这是否是一个有效的问题,因为我宁愿选择根据上下文指定不同的验证(目录实体是如何查看/视图模型的正在使用),你可以看看:
http://fluentvalidation.codeplex.com/
您将在类(而不是注释)中构建验证规则,然后您可以根据上下文,继承层次结构创建不同的版本,并且可以在业务层或UI层中应用验证。该项目包含与MVC3很好地集成的钩子。