如何将数据注释从模型投影到视图模型?

时间:2013-03-18 19:33:47

标签: asp.net-mvc razor data-annotations

我有一个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。

2 个答案:

答案 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很好地集成的钩子。