2

私は新しいプロジェクトに取り組んでおり、以前のプロジェクトの難しさのいくつかを見て、モデルからビューを十分に分離できなかった(特にMVCを使用して-モデルとビューが互いに少しブリードし始めた)、 MVVMを使いたかった。

基本的な考え方は理解していて、使い始めてワクワクしています。しかし、私を少し逃がす1つのことは、ViewModelにどのデータを含める必要があるかということです。

たとえば、フォームで編集できるように2つのデータを含むViewModelを作成している場合、次のようにキャプチャしますか?

public PersonAddressViewModel {
    public Person Person { get; set; }
    public Address Address { get; set; }
}

またはこのように:

public PersonAddressViewModel {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetName { get; set; }
    // ...etc
}

私にとって、最初のものは私たちがやろうとしていることに対してより正しいと感じます。より細かい形式を実行している場合(おそらく、キャプチャしているのはFirstName、LastName、およびStreetAddressだけでした)、そのレベルに下げる方が理にかなっている可能性があります。ただし、フォーム内のすべての個人データとすべての住所データをキャプチャしているため、最初のデータは正しいと思います。そのように物事を分割することは意味がないようです(そして多くの余分な作業)。

洞察に感謝します。

4

4 に答える 4

2

Personオブジェクトのすべてのフィールドを使用している場合は、複雑なビューモデルを使用しても問題はありません。ただし、あちこちでフィールドのみを使用している場合は、使用している値のみを使用してビューモデルを構築することをお勧めします。

ビューモデルは好きなように作成できますが、ビューモデルを使用することの全体的なポイントは、ビューモデルをそれが表すビューに合わせてカスタマイズする必要があるということです。

AutoMapperなどを使用してビジネスモデルやドメインモデルにマッピングする場合は、オブジェクトの定義が類似している必要があるため、最初の方法を使用する方がはるかに簡単です。

于 2012-10-14T03:36:58.530 に答える
0

MVVMを使用していません。モデルクラスを壊さないようにするために、ビュー専用のクラスであるViewModelsを定義しています。その場合、あなたはあなたの最高の利益のためにあなたが望む特性を定義することができます。例では、2番目の解決策を選択しますが、それはあなた次第です。

私は多くの開発者プロバイダーとの大きなプロジェクトに取り組んでいます。その場合、お客様は、懸念事項としてモデル(ビジネスエンティティと呼ばれるもの)を保持する必要があるViewModelを定義するように指示します。私たちは異なるグループであるため、別のViewModelについて心配することはなく、別のビューが最初のビューと少し異なっていても、1つのビューに1つのクラスを使用することもできます。これは、純粋なモデルを使用する代わりに、ViewModelsの利点の1つです。

データバインディングのために、JSONオブジェクトを介してクライアント側でViewModelを定義することを好みます。これにより、knockoutjs、angularjs、backbonejsなどを介してMVVMを実際に使用できます。

MVVMを使用する場合は、knockoutjsを確認してください。とても使いやすくて楽しいです

于 2012-10-14T07:56:50.773 に答える
0

Modelクラスを直接使用するか(最初の例のように)ViewModelクラスでラップすると、Modelクラスに機密性の高いプロパティ(つまり、UserクラスのIsAdmin)がある場合、セキュリティの問題が発生する可能性があります。

コントローラのアクションがPersonAddressViewModel入力パラメータを受け取るとしましょう。

public ViewResult someAction(PersonAddressViewModel personAddress)
{
  //save it
}

悪意のあるユーザーは、UIがそのような機能を提供していなくても、基本的にPersonAddressViewModel複合オブジェクトに任意のプロパティを設定できます。これは、MVCのデフォルトのバインディングメカニズムによって可能になります。これを回避するには、機密性の高いモデルクラスをラップしないか、Bind属性を使用します。

詳細はこちら:Pro ASP.NET MVC 3 Framework 3rd Edition By Steven Sanderson、Adam Freeman(第17章)

于 2012-10-18T14:37:47.547 に答える
-1

そのビューモデルを使用してフォームをレンダリングしている場合は、フォームに必要なすべてのビューデータを組み合わせているため、2番目のアプローチに投票します。

于 2012-10-14T03:13:09.467 に答える