2011-01-06 18 views
1

私は3つのプロジェクト/ライブラリを持っています。私SiteModelライブラリでASP.NET MVC POCOクラスと検証

SiteService(WCFサービス)
SiteModel(POCOオブジェクト)
SiteMVC(Webアプリケーション)

私はPOCOオブジェクトのみを持っています。これらのオブジェクトはt4テンプレートによって生成されるため、何も変更しないことをお勧めします。 SiteServiceはこれらのPOCOオブジェクトを使用し、それらをシリアル化します(EFデザイナから生成されたクラスの代わりにPOCOオブジェクトを使用する理由)。

WebApplicationでこれらのPOCOオブジェクトで検証を使用します。私はモデルライブラリを可能な限りきれいに保ち、異なるアプリケーションではルールが異なるため、DataAnnotationsを使用しません。

ASP.NET MVC2で検証するにはどのような方法が最適ですか? DataAnnotations(バディークラス)を使用することは可能ですか?

答えて

3

T4テンプレートが部分クラスを生成する場合は、運が良いです。

あなたは別の部分的な定義を作成し、MetadataTypeとそれを飾ることができます。

// T4 Generated Code 
public partial class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; }   
} 

// Your partial in a separate file 
[MetadataType(typeof(ItemValidation))] 
public partial class Item 
{ 
} 

// Any DataAnnotations go here 
public partial class ItemValidation 
{ 
    [Required(ErrorMessage = "You need to have a Name!")] 
    public string Name { get; set; } 
} 

はそうでない場合は、あなたの唯一の他のオプションは、WebプロジェクトにDataAnnotationsとのviewmodelsを作成し、あなたのモデルの間でマッピングすることであろう(クリーンPOCOオブジェクト)とViewModel。

+0

+1:巧妙です(ただし、2番目の 'public partial class Item'宣言がありませんでした)。 – rsenna

+0

@rsenna - 残りの部分を入力することに心配していました。ハハ。一定。 –

+0

すばらしく、ありがとう! – Steven

0

FYI。部分クラスは動作しますが。 RIAまたはWCFを使用していて、プロパティを表示したい場合は、[DataMember]属性を追加する必要があります。

public partial class Employee 
{  
    [DataMember] 
    public string ComposedName 
    { 
     get 
     { 
      return String.Format("{0}, {1}", this.LastName, this.FirstName); 
     } 
     set 
     { throw new NotImplementedException(); } 
    } 
}