0

我有一个CatalogEF 实体,我在元数据类中进行了装饰,如下所示:

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。

4

2 回答 2

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.
    }
}
于 2013-03-18T20:52:00.807 回答
0

如果您真的担心违反 DRY 原则,尽管我不确定这是一个有效的问题,因为我宁愿选择根据上下文指定不同的验证(目录实体的使用方式的视图/视图模型) ,你可以看看这个:

http://fluentvalidation.codeplex.com/

您将在一个类(而不是注释)中构建您的验证规则,然后您可以根据上下文、继承层次结构创建不同的版本,并且您可以在业务层或 UI 层应用验证。该项目包含与 MVC3 很好地集成的钩子。

于 2013-03-18T21:45:21.250 回答