1

viewModel のプロパティの構成について質問があります。私が理解している限り、viewmodel はできるだけシンプルにする必要があり、主に行うべきことは、データをビューにバインドすることです。

問題は、ビューモデルのプロパティを BL モデルと区別する方法です。たとえば、次のようなBLモデルがあります。

   public class UserDetailsModel
    { 
        public string UserName {get;set;}
        public string SomeInfo{get;set;}
        public string AnotherInfo{get;set;}
        public string Anything{get;set;}
        public string Something {get;set;}
        ...

     }

次に、別の BL モデルに次のように言わせます。

 public class UserInfoModel
        { 
            public string Info1{get;set;}
            public string Info2{get;set;}
            public string Info3{get;set;}
            public string Info4{get;set;}
            public string Info5 {get;set;}
            ...

         }

問題は、両方の BL モデルのデータを持つ必要がある ViewModel を作成するためのベスト プラクティスは何かということです。

1) 2 つのモデルからプロパティを複製し、デフォルト モデル バインディングを使用してビューからコントローラーにデータを転送し、ViewModels から BL モデルを作成し、リポジトリ更新データを介して ? この場合、コードの重複があります...

2) ViewModel は次のようになります。

 public class UsersIdentificationViewModel 
        {
            public UsersIdentificationViewModel()
            {
                UserInfoModel = new UserInfoModel();
            }

            public UserInfoModel UsersInfo { get; set; }

            public UserDetailsModel UserDetails { get; set; }   

        }

この場合、デフォルトのバインディングは機能しません (間違っている場合は訂正してください)。カスタム モデル バインダーまたはこのようなものを作成する必要があります。

4

1 に答える 1

0

ビュー モデル内で BL モデルのプロパティを使用する必要がある場合、最適なオプションは、BL モデルをビュー モデル内のプロパティとして埋め込むことです。あなたが言ったように、プロパティ名の重複を避けることができます。これは明らかに良いことです。

public class UsersIdentificationViewModel 
{      
    public UserDetailsModel UserDetails { get; set; }        
    public UserInfoModel UsersInfo { get; set; }

    // I added this propery so I can round up the binding process in case the properties are simple types
    public string SomeSimpleProperty { get; set; }
}

この場合、デフォルトのモデル バインディングが機能します。アクション メソッドのパラメーターは複合型UsersIdentificationViewModelDefaultModelBinderなるため、リフレクションを持つクラスはパブリック プロパティを取得し、それらが単純型か複合型かを確認してから、それぞれにバインドします。

プロパティが複合型の場合、このプロセスが繰り返されます。パブリック プロパティのセットが取得され、バインダーはそれらの値を見つけようとします。プロパティ名はネストされています。例: の値を設定するためUserNameに、モデル バインダーはネストされたデータ項目を探しますUserDetails.UserName

プロパティが単純なタイプの場合、バインダーはリクエスト内でプロパティと同じ名前のデータ項目を探します。例: このSomeSimplePropertyプロパティにより、バインダーはSomeSimplePropertyデータ項目を検索します。このリンクは、モデル バインディングの説明に非常に役立ちます。

単体テストでは、ケース 1 または 2 を選択しても問題や違いはありません。

于 2013-02-28T15:18:14.877 に答える