MVC ルールを破ることなく (ASP.NET MVC を使用して) マスター ページにデータを渡す方法は何ですか?
個人的には、すべてのビューに渡される抽象コントローラー (基本コントローラー) または基本クラスをコーディングすることを好みます。
MVC ルールを破ることなく (ASP.NET MVC を使用して) マスター ページにデータを渡す方法は何ですか?
個人的には、すべてのビューに渡される抽象コントローラー (基本コントローラー) または基本クラスをコーディングすることを好みます。
ビューに厳密に型指定されたビュー データ クラスを持たせたい場合は、これでうまくいくかもしれません。他の解決策はおそらくより正しいですが、これはデザインと実用性のバランスが取れています。
マスター ページは、それに関連する情報のみを含む、厳密に型指定されたビュー データ クラスを受け取ります。
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
そのマスター ページを使用する各ビューは、その情報を含み、マスター ページ ビュー データから派生する、厳密に型指定されたビュー データ クラスを受け取ります。
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
個々のコントローラーに、マスター ページ データをまとめることについて何も知られたくないので、そのロジックを各コントローラーに渡されるファクトリにカプセル化します。
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
継承はマスターとビューの関係によく一致しますが、パーシャル/ユーザーコントロールのレンダリングに関しては、ビューデータをページビューデータに構成します。
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
これはコード例であり、そのままコンパイルすることは意図されていません。ASP.Net MVC 1.0 用に設計されています。
マスター ビューのデータ駆動型の部分をパーシャルに分割し、Html.RenderActionを使用してレンダリングすることを好みます。これには、一般的なビュー モデルの継承アプローチよりもいくつかの明確な利点があります。
編集
Generic Errorは、以下のより良い回答を提供しています。読んでください!
元の回答
Microsoft は実際に、これを処理する「公式」の方法に関するエントリを投稿しました。これは、その理由の説明とともに段階的なウォークスルーを提供します。
要するに、彼らは抽象コントローラー クラスの使用を推奨していますが、自分の目で確かめてください。
抽象コントローラーは良いアイデアですが、私はより良い方法を見つけていません。他の人が何をしたかにも興味があります。
いろいろ調べていたら、この2つのサイトにたどり着きました。多分彼らは助けることができます。
ビューに渡すすべてのモデル オブジェクトの共通の親は非常に便利です。
いずれにせよ、ページ間に共通のモデル プロパティが常に存在する傾向があります。
Request.Params オブジェクトは可変です。リクエスト処理サイクルの一部としてスカラー値を追加するのは非常に簡単です。ビューの観点からは、その情報は QueryString または FORM POST で提供された可能性があります。h番目
別の良い方法は、いくつかのインターフェイスの ParentView のようなプロパティを持つビュー用のインターフェイスを作成することです。これにより、ページへの参照が必要なコントロール (親コントロール) と、からアクセスする必要があるマスター ビューの両方に使用できます。ビュー。
他のソリューションは洗練されておらず、時間がかかりすぎます。ほぼ1年後に、この非常に悲しく貧しいことをしたことをお詫びします。
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
明らかに、SiteMasterViewData に SiteMasterViewData を返すこの静的メソッド Get() があります。