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は、以下のより良い答えを提供しています。読んでください!
元の回答
マイクロソフトは実際にこれを処理するための「公式」な方法でエントリーを投稿しました。これは、彼らの推論の説明とともに段階的なウォークスルーを提供します。
つまり、抽象コントローラークラスを使用することをお勧めしますが、自分で確認してください。
私はいくつかの調査を行い、これら2つのサイトに出くわしました。多分彼らは助けることができました。
Request.Paramsオブジェクトは変更可能です。要求処理サイクルの一部としてスカラー値を追加するのは非常に簡単です。ビューの観点からは、その情報はQueryStringまたはFORM POSTで提供されている可能性があります。hth
他のソリューションは優雅さに欠け、時間がかかりすぎます。ほぼ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()があることは明らかです。