2010-12-31 14 views
4

私はPOCOを使用してEF4でMVC3アプリケーションを作成しています。 EFエンティティに検証属性を追加しました。さて、私はビューを構築しているので、ビューモデルを使用したいと思います(おそらく、AutoMapperを使ってそれらを埋めてください)。MVC、ViewModels、およびValidation

私が遭遇した問題は、DRYプリンシパルに違反するビューモデルの検証属性を再定義する必要があることです。たとえば、フィールドのサイズを変更する場合、POCOとそれを使用するビューモデルの両方でMaxLength属性を変更する必要があります。

POCOの検証ルールをビューモデルにマップするのに手間がかかりますか?

答えて

1

私もこのように苦労していますが、DRYに違反することに同意します。私はこのHereに関する最近の質問を投稿し、かなりのプッシュバックを得ました。

実際のアプリケーションでは完全なDRYを得ることはできません。時には、盲目的にそれに固執しようとするよりも、原則に違反することから、より良い結果を得ることができます。

EDIT:

一つでもDRYシングル責任原則(SRP)に違反することができますことを考えるかもしれません。同様のコードを再利用することで、コードが複数のことを行うようになっています。データモデルとビューモデルが異なる目的を持ち、異なる責任を負うという事実を考えれば、それらを単一のモデルにまとめることはSRPに違反します。つまり、データモデルをビューモデルとすることで、それは2つの異なる責任です。

SRPをDRYと潜在的に調整しようとするさまざまな方法が考えられますが、コストのメリットを考慮する必要があります。

+0

お返事ありがとうございます。私はまだJQueryの検証のための私の検証属性を再利用するための巧妙な方法があることを望んでいる(私はコントローラーの検証についてあまり心配していない、エンティティオブジェクトはそれをうまくいくだろう)が、 - 私が望む属性を実装する。 – Brian

5

私は個人的にビューモデルで検証を行います。これは、コントローラがビューから受け取るもので、ユーザ入力を含むクラスです。私は二つのタイプのバリデーション・ルールを区別しています:表面バリデーションとビジネスバリデーションです。必須フィールドなどのルールは、ビューモデルで適切な形式を適用する必要がありますが、特定の名前のユーザーなどのビジネスルールは、データベースに既に存在している必要があります。

また、同じモデルにマップされた異なるビューモデルを持つこともできますが、ビューの検証ルールに基づいて異なる可能性があります。このため、ビュー・モデルにはまったく同じ検証ルールが適用されません。

2

いくつかの抽象化を得る1つのアプローチは、必要な他のビュー情報を含め、ビジネスモデルクラスの「ViewModel」を作成することです。

class MyObject 
{ 
    public int ID {get;set} 

    [Required] 
    [StringLength(512)]  
    public string Name {get;set;} 

} 

class MyViewModel // ViewModel for a specific view 
{ 
    public MyObject MyModel {get;set;}  // the model that is being edited 

    // other data the view might need, set by the controller 
    public string SomeMessage { get; set; } 
    public List<SomeObject> SomeObjects {get;set;} /// e.g. for a drop-down list 

} 

次に、ViewModelを参照してください。

@model My.Namespace.MyViewModel 


Hello @model.MyModel.Name !!! 

このようにして、ビジネスクラス内の検証および/またはデータ注釈を1か所で指定するだけです。

異なる検証をしたい場合は、検証ロジックを選択的に適用するための戦略が必要です。

関連する問題