2016-04-15 5 views
0

ダイナミックメニューを実装しようとしています。私はベースコントローラ(class PortalController : Controller)を作成しました。このクラスにいくつかの仮想メソッドを追加しました。これらの方法の1つは、サイトメニューのhtmlを生成することです。これは、私が一度それを書いて、私が必要な場合はそれを上書きすることができます。問題は、ビューから直接メソッドを呼び出すことは悪い習慣です。ASP.NET MCVコントローラのすべてのアクションのビューバック値を設定する方法

このメソッドを使用して、メインメニューのhtmlを含むビューバック文字列を作成できます。ここで問題となっているのは、ビューを返す前にすべてのメソッドがこのgenerateMenu()メソッドを呼び出す必要があるということです。その解決策が、私はそれが好きではない。これをオブジェクトレベルで行うよりクリーンな方法がありますか?デフォルトでは、 "PortalController"を継承するすべてのオブジェクトは自動的にviewbag変数にメニュー文字列を持ちます。これどうやってするの?

これまでのところ私はこれを書いています。私が本当に好きなのは、ほぼコンストラクタに相当します。メニューは、オブジェクトが構築されたときに生成されます。以下のメソッドを使用すると、ビューが呼び出されたときにのみメニューがレンダリングされます。私は、コントローラ内の複数のアクションがメニュー内の異なる項目を持つ能力が必要です。

protected override ViewResult View(IView view, object model) 
{ 
    ViewBag.Menu = this.GenerateMenu(); 
    return base.View(view, model); 
} 

答えて

0

コントローラにメニューHTMLを生成する義務はありますか? 私はそれが悪いparcticeだと思う。 基本メニューから始め、cssを使って操作することができます。 メニューは、レイアウトページ、または関連する他のビューで呼び出される部分的なビューになければなりません。

<div class="navbar-collapse collapse"> 
       <ul class="nav navbar-nav"> 
        <li>@Html.ActionLink("Home", "Index", "Home")</li> 
        <li>@Html.ActionLink("About", "About", "Home")</li> 
        <li>@Html.ActionLink("Contact", "Contact", "Home")</li> 
       </ul> 
       @Html.Partial("_LoginPartial") 
</div> 

あなたはjqueryのCSSの表示を使用してdymanicallyメニューを表示したり、コントローラのアクションでの役割を非表示にします。 コールajaxを使用して表示するメニューが表示されます。あなたはPortalControllerからすべてのビューでHtml.Partialを使用して、このメニューを生成し、(それが必要な場合は)このビューのモデルとして、いくつかのオブジェクトを渡すことができ

1

@model Foo 

@Html.Partial("menu", Foo) 

/* rest of the page */ 
<form> 

</form> 
0

あなたは、動的にDBなどから(メニュー項目を構築している場合)、レイアウトファイルから呼び出すことができるアクションメソッドを作成することができます。

この

public class MenuItem 
{ 
    public string Text { set; get; } 
    public string TargetUrl { set; get; } 
    public List<MenuItem> Childs { set; get; } 
    public MenuItem() 
    { 
     this.Childs=new List<MenuItem>(); 
    } 
} 

としたいしかし、あなたのビューでは、あなたのメニュー項目をレンダリングするためにこれを使用するようにMenuItemクラスを持っていると仮定すると

public ActionResult RenderMenu() 
{ 
    // Build the data needed to render the menu. Pass to the view 

    var menu = new List<MenuItem> 
    { 
     new MenuItem(){ 
      Text = "Home", 
      Childs = new List<MenuItem> 
      { 
       new MenuItem {Text = "About"} 
      } 
     } 
    }; 
    return PartialView(menuItems); 
} 

は、すべてのページでこのメニューを含めるには、単にレイアウトにHtml.Actionメソッドを呼び出すことができます

@Html.Action("RenderMenu","ControllerName") 

それとも、すべてのあなたの要求のためでviewbagために何かを設定したい場合は、あなたが作成することができますそれを行うアクションフィルタ。

これをGlobal.asax.csのApplication_Startイベントでグローバルフィルタとして登録してください。

GlobalFilters.Filters.Add(new LoadMenu()); 
関連する問題