ASP.NET MVCの「RenderPartial()」メソッドは、非常に低レベルの機能を提供します。真の「サブコントローラー」モデルを提供したり、提供しようとしたりすることはありません*。
'RenderPartial()'を介してレンダリングされるコントロールの数が増えています。それらは3つの主要なカテゴリに分類されます。
1)そのページのモデルを使用する特定のページの直接の子孫であるコントロール
2)特定のページの直接の子孫であり、そのページのモデルを特定の タイプの追加のキーとともに使用するコントロール。'DataRepeater'の実装を考えてください。
3)表示されるページに関連のない機能を表すコントロール。これは、バナーローテーターから、フィードバックフォーム、ストアロケーター、メーリングリストのサインアップまで、何でもかまいません。重要なのは、どのページに配置されているかは関係ないということです。
モデルの動作方法により、ViewData
リクエストごとに1つのモデルオブジェクトしか存在しません。つまり、サブコントロールに必要なものはすべてページモデルに存在する必要があります。
最終的に、MVCチームは真の「サブコントローラー」モデルを作成することを望んでいますが、それまでは、子コントロールにも必要なものをメインページモデルに追加するだけです。
上記の(3)の場合、これは「ProductModel」のモデルに「MailingListSignup」モデルのフィールドが含まれている必要がある可能性があることを意味します。明らかにそれは理想的ではありませんが、私はこれを現在のフレームワークとの最良の妥協点で受け入れました-そして将来のサブコントローラーモデルへの「ドアを閉める」可能性は最も低いです。
モデルは実際にはデータをどこから取得するかを知らないダムデータ構造である必要があるため、コントローラーはモデルのデータを取得する責任を負う必要があります。しかし、コントローラーがいくつかの異なる場所でモデルを作成する必要はありません。
私が始めたのは、モデルを作成するためのファクトリを作成することです。このファクトリはコントローラによって呼び出されます(モデルはファクトリについて認識していません)。
public static class JoinMailingListModelFactory {
public static JoinMailingListModel CreateJoinMailingListModel() {
return new JoinMailingListModel()
{
MailingLists = MailingListCache.GetPartnerMailingLists();
};
}
}
ですから、私の実際の質問は、この同じ問題を抱えている他の人々が実際にモデルをどのように作成しているかということです。新しいMVC機能との将来の互換性のための最良のアプローチは何でしょうか?
- 注意:ここでは取り上げ
RenderAction()
ない問題があります。特に、MVCContribのみであり、ASP.NET-MVCのRTMバージョンには含まれないという問題があります。他の問題は私がそれを使わないことを選んだ十分な問題を引き起こしました。それで、今のところRenderPartial()
存在するだけのふりをしましょう-または少なくともそれは私が使用することに決めたものです。