現在、_SubMenu.cshtml という名前の共有ファイルがありますが、これをすべてのビューに実装する必要があります。
したがって、RenderBody() でレンダリングされたビューに応じて変化する共有マスター レイアウト ファイルにコンテキスト依存メニューを実装する「適切な」方法があるかどうか疑問に思っています。
個々のコントローラーがこれを処理する必要がありますか、それとも別の場所で処理する必要がありますか?
現在、_SubMenu.cshtml という名前の共有ファイルがありますが、これをすべてのビューに実装する必要があります。
したがって、RenderBody() でレンダリングされたビューに応じて変化する共有マスター レイアウト ファイルにコンテキスト依存メニューを実装する「適切な」方法があるかどうか疑問に思っています。
個々のコントローラーがこれを処理する必要がありますか、それとも別の場所で処理する必要がありますか?
_SubMenu.cshtml
次のように、コントローラ固有の を作成できます。
~/Views/Controller1/_SubMenu.cshtml
~/Views/Controller2/_SubMenu.cshtml
~/Views/Controller2/_SubMenu.cshtml
次に、あなたのLayout
:
@Html.Partial("_SubMenu")
_SubMenu
View-Engine は、現在のコントローラーに基づいて適切なものを取得します。
または、単一の_SubMenu
パーシャルを使用することを主張する場合はswitch
、現在のコントローラーで適切な html をレンダリングできます。
<div id="menu">
@switch (this.ViewContext.RouteData.Values["controller"].ToString().ToLower())
{
case "controller1":
<a href="#">Controller 1 Action</a>
<a href="#">Another Controller 1 Action</a>
break;
case "controller2":
<a href="#">Controller 2 Action</a>
<a href="#">Another Controller 2 Action</a>
break;
}
</div>
子アクションを使用できます。アイデアは、次のようなコントローラー アクションを持つことです。
public class SomeController: Controller
{
[ChildActionOnly]
public ActionResult SomeAction()
{
SomeViewModel model = ...
return PartialView(model);
}
}
すると、対応する部分ビューが表示されます。
@model MyViewModel
...
レイアウトまたはビューに含めることができるもの:
@Html.Action("SomeAction", "SomeController")
Phil Haack は、子の行動についてここでブログを書いています: http://haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
特定の ViewData || のマスター/共有レイアウト チェックを行うこともできます。ビューバッグ値。
@if(ViewData["_ContextMenuList_"] is List<ContextMenuItem>) {
/// render the rest of the menu directly or in a strongly typed partial view.
}
メニュー テキスト、アクション、コントローラー、htmlClass、およびいくつかのルート値を持つオブジェクトのリストを使用します。
public class ContexMenuItem
{
public string MenuText { get; set; }
public string Action { get; set; }
public string Controller { get; set; }
public object RouteValues { get; set; }
public object HtmlValues { get; set; }
}
次に、意味のあるコントローラ アクションでのみこの値を設定し、関連するコンテキスト データを入力します。
// Inside some controller action.
//asuming some how you already got your client's info.
var contextMenu = new List<ContexMenuItem>();
contextMenu.Add(new ContexMenuItem()
{
MenuText = "View More " + client.Name + "'s Info",
Action = "ViewMore",
Controller = "Clients",
HtmlValues = null,
RouteValues = new { id = client.ID }
});
contextMenu.Add(new ContexMenuItem()
{
MenuText = "Send a message to " + client.Name ,
Action = "SendMessage",
Controller = "Inbox",
HtmlValues = null,
RouteValues = new { id = client.ID }
});
ViewData["_ContextMenuList_"] = contextMenu;
これは、特定のコントローラーの関連するすべてのアクションで実行する必要があるため、面倒な場合があります。その場合は、そのコードをコントローラー内のプライベート関数にリファクタリングし、適用時に呼び出します。
このデータは常に Model クラスにあるべきだと主張する人もいるかもしれませんが、この場合、これはコンテキスト データであり、手元のモデルの一部であるとは限りません。また、モデルの知識がないマスター クラス内にレンダリング コードを配置するだけで、コーディングが容易になります。一部の MVC テンプレートにある _LogOnPartial.cshtml によく似ています。