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.NetMVC 1.0用に設計されています。
マスタービューのデータドリブンの断片をパーシャルに分割し、Html.RenderActionを使用してレンダリングすることを好みます。これには、一般的なビューモデルの継承アプローチに比べていくつかの明確な利点があります。
抽象コントローラーは良いアイデアであり、私はより良い方法を見つけていません。他の人が何をしたかにも興味があります。
私はいくつかの調査を行い、これらの2つのサイトに出会いました。たぶん彼らは助けることができます。
ビューに渡すすべてのモデルオブジェクトの共通の親が非常に便利であることがわかりました。
とにかく、常にページ間にいくつかの一般的なモデルプロパティがある傾向があります。
別の良い方法は、いくつかのインターフェイスのParentViewのようなプロパティを持つビューのインターフェイスを作成することです。そのため、ページへの参照を必要とするコントロール(親コントロール)とアクセスする必要があるマスタービューの両方に使用できますビュー。
他のソリューションは優雅さに欠け、時間がかかりすぎます。ほぼ1年後、この非常に悲しく貧しいことを行ったことをおaびします。
<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()があります。
Request.Paramsオブジェクトは変更可能です。要求処理サイクルの一部としてスカラー値を追加するのは非常に簡単です。ビューの観点から、その情報はQueryStringまたはFORM POSTで提供されている可能性があります。 hth