1

現在、_SubMenu.cshtml という名前の共有ファイルがありますが、これをすべてのビューに実装する必要があります。

したがって、RenderBody() でレンダリングされたビューに応じて変化する共有マスター レイアウト ファイルにコンテキスト依存メニューを実装する「適切な」方法があるかどうか疑問に思っています。

個々のコントローラーがこれを処理する必要がありますか、それとも別の場所で処理する必要がありますか?

4

3 に答える 3

1

_SubMenu.cshtml次のように、コントローラ固有の を作成できます。

~/Views/Controller1/_SubMenu.cshtml
~/Views/Controller2/_SubMenu.cshtml
~/Views/Controller2/_SubMenu.cshtml

次に、あなたのLayout

@Html.Partial("_SubMenu")

_SubMenuView-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>
于 2013-10-07T07:11:57.660 に答える
0

子アクションを使用できます。アイデアは、次のようなコントローラー アクションを持つことです。

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

于 2013-10-07T07:03:43.503 に答える
0

特定の 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 によく似ています。

于 2013-10-09T18:12:46.050 に答える