2012-04-09 12 views
0

これはasp.net mvc3プロジェクト用です。私は2つのビューとそれに対応するビューモデルを持っています。別のビューで使用される基本ビューモデルから派生したビューモデルを使用するMVC

Home.aspxはのviewmodel HomeVM

HomeChild.aspxがHomeChildVMとしてのviewmodelを有しています。

今すぐHomeChildVMはHomeVMから派生し、いくつかのプロパティがあり、独自のビューで使用されます。私のコントローラには、ホームビューを返すアクションメソッドとHomeChildビューを返すアクションメソッドがあります。どちらのアクションメソッドも、タイプをHomeVMとして返す1つのビジネスメソッドを呼び出します。その後、私のアクションメソッドは、aspxビューに同じを返します。

さて、代わりに別のビジネスメソッドを記述し、ちょうど別のviewmodelタイプすなわちHomeChildVMを返すために、もう一度、すべてのコードを繰り返すことで、私はそうのようなものでobjHomeChildVM 1にobjHomeVMのプロパティを割り当てています
return View(objHomeVM); 

objHomeChildVM.prop1 = objHomeVM.prop1; 
objHomeChildVM.prop2 = objHomeVM.prop2; 

し、それを返す:

return View(objHomeChildVM); 

は、プロパティを一つずつ割り当てることによってよりも、これを行うには良い方法はありますか?これを行う唯一の方法でない限り、これはあまりにも原始的な方法だと私は感じています。

私はHomeVMに、私はHomeChildVMだけHomeChild.aspxページに固有であるた余分なプロパティを使用できるように文句を言わないことに変更した場合HomeChild.aspx現在このページディレクティブ

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<HomeChildVM>" %> 

を持っています。

これについてのご意見はありますか?

ありがとうございます...

+0

この質問にはASP.NET MVC3というタグが付けられましたが、以前のバージョンのMVCを使用しているようですか?これらのタグも追加してみてください。 –

+0

そのMVC3プロジェクト – user20358

+0

MVC3プロジェクトの場合は、.cshtmlで終わるビューを使用することをお勧めします。ビューの開始ページを使用して、ビューのマスターページを指定します。コードは違って見えますが、@以外は<%%>を使用しないでください。 –

答えて

0

あなたのビューモデルにちょうど注意してください。私は両方のビューのビューモデルを作成しますが、プロパティのいくつかは両方で使用されています。 HomeVMのプロパティの1つを削除する必要がある場合はどうしますか?その後、HomeChildVMは分解されます。

プロパティを1つずつ割り当てる際に質問に戻る...私はAuto Mapperを見ることをお勧めします。オブジェクト間のプロパティのマッピングが自動的に処理されます。

あなたのタイプを持っている、とAutoMapperを参照すると、次の2つのタイプのマップを作成することができます

を更新:

Mapper.CreateMap<Customer, CustomerDto>(); // Create the map 

タイプ左側にはソースタイプです、右側のタイプは宛先タイプです。

public static Customer Map(CustomerEntity entity) 
{ 
    return new Customer 
    { 
      CustomerId = entity.CustomerId, 
      Company = entity.CompanyName, 
      City = entity.City, 
      Country = entity.Country 
    }; 
} 

そして、それは次のようになります使用する:ここで

CustomerDto dto = Mapper.Map<Customer, CustomerDto>(customer); 

あなたは2つのオブジェクト間をマッピングする/使用を書くことができ、いくつかのサンプルコードです:マッピングを実行するには、地図のメソッドを使用しますこの:

Mapper.Map(customer); 
+0

他のシナリオでは良い点です。このような状況では、それが問題になる可能性はほとんどありません。子ビューはホームビューの拡張です。親ビューには、レコードを表示するテーブルがあります。子ビューは、同じビューにいくつかのフィルタ基準を追加し、アプリケーションの全く異なる領域に関連する他の追加のビュー詳細を追加します。親から出るものがあれば、それは子供からも出る。 – user20358

+0

オートマッパーは唯一の方法ですか?私はC言語のネイティブを見ていた# – user20358

+0

オートマッパは私が考えることができるすべてです。あなたがそれを使用したくない場合は、私はそれを書くことをお勧めします。 Automappperはコードをずっと少なくします。ビューモデルに30のプロパティがある場合は、すべてのコードを想像することができます。 Automapperを使用すると、2行のコードですべてをマッピングできます。 –

0

あなたが移入する、HomeVMの種類として、ビジネス方法の外に必要なビューモデルを作成し、あなたのビジネスメソッドにビューモデルの参照を渡すと考えていますか?すなわち:

public ActionResult HomeAction() 
{ 
    HomeVM objHomeVM = new HomeVM(); 

    BusinessMethod(objHomeVM); 

    return View(objHomeVM); 
} 

public ActionResult HomeChildAction() 
{ 
    HomeChildVM objHomeChildVM = new HomeChildVM(); 

    BusinessMethod(objHomeChildVM); 

    return View(objHomeChildVM); 
} 

private void BusinessMethod(HomeVM objHomeVM) 
{ 
    ... 
    objHomeVM.prop1 = prop1; 
    objHomeVM.prop2 = prop1; 
    ... 
} 

ViewModelsは単なる通常のオブジェクトです。特別なことは、ViewModelsと呼ばれることだけです。

+0

は動作しません。ビジネスメソッドは、objHomeVM型のオブジェクトに対して内部的に動作し、objHomeVMも返します。いくつかのパラメータに基づいて別の型を返すことができるようにするには、渡された型を判別するためにリフレクションや何かを使って旧式のやり方で行う必要があり、その特定の型のみを設定し、これは、その特定のビジネスメソッドをすべてやり直して再テストすることを伴います。私はちょうど既存の機能を拡張したい – user20358