lolstore.infoを開発する際の、継承とViewModelのネストとの戦い

ご挨拶、ハラチタテル。

Asp.Net Mvcの研究とlugstore.infoの開発の過程で生まれた自転車の実装を共有したいと思います。 私にとっては便利ですが、これもあなたのためになる可能性があります。



まず、問題/目標を定式化します。


すべてを傷つけます。 いくつかの(!)型付きViewModelをコントローラーからViewに転送し、コンパイル段階で型チェックを使用してそれらをレンダリングする簡潔で透過的な方法を見つけます。



マスターページに1つのViewModel(htmlタイトル、アクセス可能なメニューなど)が必要な場合、ページに別の例(逸話のリストなど)が必要な場合、ページレットの場合は通常3番目(タグのリスト)になります。 さらに、同じページレットを他のページに簡単に移植できるようにするかゆみ。



さて、理解し始めましょう:
思考の飛行:


各ViewModelは個別に何ですか? お茶をすすりながら思った。 答えはそれ自体で熟成しました: 可能であればロジックなしの型付きデータのコンテナー (HtmlHelper拡張メソッドでのロジックのレンダリングも好きです)。



既存のツールを使用して複数のモデルをコントローラーからビューに転送する方法は? -飲み物のもう一口、 -mm、同じViewDataがありますが、最初はそれを拒否しました。



コンパイル時に型チェックを行い、文字列キー検索を取り除く方法は? -救助に汎用的! -クッキーを噛みます。



実装を追加する方法ですが、使用するために何かを継承する必要はありませんか? -Taki拡張。



...


利益:


実際、次の2つの方法があります。

他の拡張機能は、便宜上のみ追加されました(そのうちのいくつかのみです)。

public static TModel Model < TModel > このコントローラーコントローラー

{

コントローラーを返します。 ViewDataモデル < TModel > ;

}



public static TModel Model < TModel > この HtmlHelper htmlHelper

{

htmlHelperを返します。 ViewDataモデル < TModel > ;

}


プラスとして、あなたは強調することができます: いくつかのマイナス:
使用法:


コントローラー内:
Public ActionResultデフォルト

{

...

//ページレットでレンダリング

これモデル < TagListViewModel > MyBlaBlaBlaProperty = " lolstore.info " ;



//アクションの現在のマスターページで使用

これモデル < UserMenuViewModel > MyBlaBlaBlaProperty2 = "ジョーク" ;

}


強い型の継承のないビュー:

<% = thisモデル < TagListViewModel > MyBlaBlaBlaProperty %>


HtmlHelperの場合:

public static MvcHtmlString RenderSomething この HtmlHelper htmlHelper

{

if htmlHelper。ModelExists < TagListViewModel >

{

return new MvcHtmlString String。Empty ;

}



TagListViewModelモデル= htmlHelper。 モデル < TagListViewModel > ;

//どのスレッドをレンダリングする

}


コードファイル全体は、 ここからダウンロードできます



Z.Y. このような実験が居住者にとって興味深いものであり、私のプロジェクトだけでなく適用できる場合は、競合および非同期キャッシングの実装、単純なAutoMapper(継承、インターフェース、コンパイル段階での検証なしで、あるタイプのオブジェクトを別のタイプにクローンするために使用)およびその他の有用性をレイアウトします。



によってEugeneOstapchuk



All Articles