0

次のよう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 つの場所にあるように、この方法を維持したいと考えています。また、ビューごとに 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 に答える