2011-02-09 16 views
0

前にブログでこれを行う方法を見たことがありますが、どこでどのように忘れましたか。クラスライブラリにドメインがあるとします。私はデータをWebプロジェクトのビューモデルとしてこのドメインのプロパティに注釈を付けたいと思います。ASP.NET MVCデータWebプロジェクトのドメインモデルに注釈を付ける

どうすればよいですか?

たとえば、このドメインは、私のクラスライブラリである:

私のWebプロジェクトで
public class Person { 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
} 

、これがあります:

//Do i need to set some attribute here? 
public class CreatePersonViewModel{ 

    [Required()] 
    [DisplayName("First Name")] 
    public string FirstName {get; set;} 
} 

このコードは、ツールなしPersonにマッピングすることができます。おそらく部分的か何か。

+0

いいえ、ここで属性を設定する必要がある場合は属性を設定する必要はありません。コントローラアクションのパラメータタイプが 'CreatePersonViewModel'である場合、検証属性は' ModelState'が有効かどうかを判断するために実行されます。 –

+2

私はメタデータクラスの使用を促すすべての答えを下げました。メタデータのバディークラスは、ドメインや懸念事項の分離の目的を完全に無効にします。 UIはあなたのUIを指し示すドメインではなく、あなたのドメイン内を指し示すべきです。それは落胆すべき恐ろしい習慣です。 – jfar

+0

@jfar:厳密に言えば、メタデータクラスは懸念を分けています。軽くやることではありませんが。あなたのモデルが生成された場合は、実際のプロパティに注釈を付けることはできませんが、実際のプロパティには属性を追加する可能性が非常に高いでしょう部分クラス定義。 –

答えて

4

属性ビューモデルを使用しての全体的なアイデアは、あなたのドメインモデルからそれを分離するようにし、ニーズに適合したものを持っていますビューのビューモデルはWebプロジェクトで宣言され、このビューに必要なすべての必要なプロパティと書式設定属性が含まれている必要があります。ドメインモデルは、ビュー固有のデータ注釈で汚染されるべきではありません。お使いのモデルがこのようになりますのであれば:

public class Person { 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
} 

次のビューモデルかもしれない:

public class CreatePersonViewModel { 
    [Required] 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 
} 

をして、コントローラは、ビューモデルにマップ、いくつかのリポジトリからモデルをフェッチしている(AutoMapperここで助けてください)、ビューモデルをビューに渡します。

+0

私は同意しません - データベースフィールド "TownSuburb"には常に "Town/Suburb"というラベルが付いているので、私の注釈はデータレイヤーで宣言しています。なぜ複数のフロントエンドにまたがってデータベースを共有しているのであろうと、私のサイトのさまざまなコンポーネントに対して2,3,4回、私の見解でこれを設定したいのですか? – Rob

+0

@Rob、あなたは特定のプレゼンテーションにあなたのモデルを結びつけているからです。別のアプリケーションでこのフィールドを別のものと呼ぶべき場合はどうでしょうか? –

+0

これは正しいので、この回答は正しくありません - 正しい答えは "それはドメインに依存します" - さらに、なぜデータベース列に固有の検証規則を切り離したいのですか? INT列の検証規則を変更して、モデルと密接に結合しないのはなぜですか? – Rob

1

あなたが事?:

using System.ComponentModel.DataAnnotations; 

public MyClass 
{ 


    [DisplayName("Street Address")] 
    public string StreetAddress { get; set; } 

} 

EDITのこのタイプについて話している:

using System.ComponentModel.DataAnnotations; 
using System.ComponentModel; 

namespace Something 

{ 
    [MetadataType(typeof(MetaMyClass))] 
    public partial class MyClass 
    { 
      //You can just leave this empty if you have nothing additional to add to the class 

    } 

    public class MetaMyClass 
    { 
     [DisplayName("Street Address")] 
     public string StreetAddress { get; set; } 
    } 
} 
+0

はい、しかし、 'MyClass'はすでに存在し、' [DisplayName( "Street Address")] 'は使用できません。アノテーションを追加する方法があります。 –

1

:あなたはエンティティがこれを行うように生成されたクラスへのデータ注釈を追加する必要がある場合

ドメインオブジェクトやビューモデルオブジェクトに注釈を付けることを意味しますか?

System.ComponentModel.DataAnnotations検証属性を使用して(とValidationAttributeから自分のいずれかを導き出す、あなたが結合モデルの時点で、あなたのviewmodelのプロパティにバインドされた値を検証することができます。

スコット・ガスリーがdetailed blog post about Model validation with data annotation validation attributesを持っています。

EDIT:あなたのタイプがすでに存在している別のポスターにコメントしてあなたが VAを保持していることを別のタイプを示すために、既存の型にMetadataTypeAttributeを追加することができると言います。あなたの既存のタイプのプロパティに適用されるリッドロジック。あなたのデータ注釈のための「バディ」クラスを作成することができます

+0

私はこれを見ています:http://stackoverflow.com/questions/1882338/can-i-add-mvc-2-dataannotation-attributes-to-existing-properties/1882428#1882428 '[MetadataTypeAttribute] 'それはビューモデルについて知らないので元のモデル上に。それとも別の方法ですか? –

+0

viewmodelsの背後にあるアイデアは、あなたのビューにあなたのコントローラにデータを渡すことを意図しているということです。それらは必ずしもあなたのドメインオブジェクト(それらを関連付ける属性、継承など)との 'code'関連を持つとは限りません。コントローラ内部では、ビューモデルとドメインオブジェクトの間の値のマッピングを実行する可能性があります。ビューモデルを使用することはできず、単純にドメインオブジェクトをビューに渡すことができますが、モデル検証の仕組みのためにこれを行う際には、特定の問題があります。 –

+0

モデルバリデーションに関するBrad Wilsonの投稿 - http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.htmlをご覧ください。彼は、入力検証からMVC 1とMVC 2の間のモデル検証への移行について語っていますが、MVC 2とMVC 3にはまだモデル検証について言われています。 –

1

[MetadataType(typeof(ResourceMetadata))] 
public partial class Resource 
{ 
    public object Value { get; set; } 
} 

public class ResourceMetadata 
{ 
    // The metadata class can define hints 

    [UIHint("ResourceValue")] 
    public object Value { get; set; } 
} 
+0

downvoteの説明が歓迎されます –

関連する問題