3

私はMVCを始めたばかりで、最初のプロジェクトを開発中です。ビューモデルとドメインオブジェクトの問題に頭を悩ませようとしています。

私のビューモデルは、顧客オブジェクトと住所オブジェクトで構成されています。問題は、顧客と住所のすべてのプロパティがビューに表示されていても、ビューモデルで各プロパティを明示的に定義した場合にのみ変更を保存できることです。つまり、ビューモデルで顧客と住所のオブジェクトのプロパティを複製する必要があります。これは私のすべての問題を解決します。

私の質問は、ビューモデルの各プロパティを明示的に定義する必要がありますか、それともタイプCustomerのCustomerプロパティとタイプAddressのAddressプロパティ(はるかに簡単です)を使用してビューモデルを定義する方法はありますか?

私がオンラインで見つけたものに基づいて、答えはビューモデルの各プロパティを定義する必要があると思います。それが正しければ、このマッピングを自動的に行う方法はありますか?

ASP.NET MVC 4

4

2 に答える 2

1

AutoMapperは、マッピングで非常に人気があります。

ViewModel定義に関しては、ViewModelをビューに直接対応させる必要があります。ビューで使用されていないプロパティがViewModelに存在してはなりません。ロジックのないビューがある場合(そうすべきです!)、多くの場合、ViewModelのプロパティは、ビューのフィールドに直接関連しています。

もちろん、2つのViewModelがまったく同じプロパティを使用する場合があり、次のようなことを妨げるものは何もありません。

public class CustomerViewModel {
    public string Name { get; set; }
    public AddressViewModel Address { get; set; }
}

public class AddressViewModel {
    public string AddressLine1 { get; set; }
}

問題は、これを開始するとすぐに、1回または2回使用されていないプロパティに陥りやすくなり、ViewModelの継承をスローして、非常に厄介なViewModelになってしまうことです。

一般的に、フラットなViewModelを使用することをお勧めします。たとえば、顧客と住所の情報を必要とする2つのビューがある場合は、ヒットして、両方のビューに個別のViewModelを作成し、両方のプロパティを複製します。

于 2012-07-17T03:33:40.777 に答える
1

ビューに必要なプロパティのみをで定義しますViewModel。ViewModelはドメインモデルに似ている場合があります。ただし、ビューモデルに必要なのは、ビューに必要なプロパティのみです。すべてのプロパティではありません。

例:プロパティを持つ顧客ドメインモデルがある場合がありますCustomerID, FirstName,LastName,CreatedDate,CreatedBy,LastModifiedDate

public class CustomerDomainModel
{
  public int CustomerID { set;get;}
  public string FirstName { set;get;}
  public string LastName { set;get;}
  public DateTime CreatedDate { set;get;}
  public DateTime LastModifiedDate { set;get;}
  public int  CreatedBy { set;get;}
}

ただし、ビュー(UI-フォーム)では、とのみのフィールドを表示する必要がある場合がありFirstNameますLastName。したがって、viewModelにはこれらの3つのプロパティのみが含まれる場合があります(FirstNameとLastName +別のプロパティCustomerIDもあります)

public class CustomerViewModel
{
  //My view is going to use only these 3 fields.
  // Hence no other properties i am defining here
  public int CustomerID { set;get;}
  public string FirstName { set;get;}
  public string LastName { set;get;} 
}

これら2つ(ドメインオブジェクトからViewModel)の間でマッピングするには、Automapperの使用を検討してください。

于 2012-07-17T03:42:58.527 に答える