2016-06-20 13 views
1

こことWeb上で似たような話題を読んでいますが、これを複製として分類するとは思わなかったので、先に進んで投稿します。MVCのデータベースの動的メニュー

public void LoadMenus() 
    { 
     var dbContext = new ContentClassesDataContext(); 
     var menus = from m in dbContext.Menus 
        where m.MenuName != "Home" && m.MenuGroup == "RazorHome" && m.RoleID == "Facility" 
        orderby m.Sequence, m.MenuName 
        select m; 

     var html = ""; 

     if (menus.Any()) 
     { 
      html += "<span/>"; 

      foreach (var menu in menus) 
      { 
       html = html + $"<a href='{menu.URL}'>{menu.MenuName}</a><br/>"; 
      } 
      html += "<hr>"; 
     } 

     Session["Menus"] = html; 
    } 

LoadMenus()は私のコントローラクラスであるので、私はカミソリの構文を使用する(私の知る限りでは)できませんよ。私は現在、それほどのようなデータベースからの私の動的なメニューをロードしています。代わりにビューからメニューをロードして、@Html.ActionLink(linkText, actionName, controllerName)を使用できるようにしたいと思います。私が現在行っている方法でHTMLをロードすると、現在のコントローラに応じて異なるリンクテキストが生成されるため、リンクが常に正しくレンダリングされるとは限りません。ビューからデータベースにアクセスできますか?あるいは、コントローラからビューへのデータベースのコンテンツを渡して、そのようにメニューをレンダリングするだけですか?

+2

剃刀を使用する場合は、 PartialViewを実行し、LoadMenusをアクション結果にし、 'PartialView(" _ Menu "、menus);をパーシャルビューで' @model IEnumerable

'をループしてメニューをビルドすることができます。 @ Hmtl.Action( "LoadMenus") 'メニューをどこに置くか – JamieD77

+0

ああ、私は' @ model'ビットが私が探していたかもしれないと思います。メニューの部分ビューを使用することはできましたが、ビュー内から情報にアクセスする方法はまだ分かりませんでした。 –

+0

私はリンクを生成し、 'Url.Action()'を使ってコントローラを指定することもできました: '$" {menu.MenuName}
" –

答えて

4

htmlをcshtmlビューに保存する必要があります。

セッションを経由するのではなく、viewmodelを通じてデータを渡す必要があります。コントローラで

1)

、(この例では、我々はいくつかの偽のデータをフェッチ)メニューデータを取得します。

メニューデータを保持し、以下に示すように、ビューに渡すことができるのviewmodelを作成:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var menu = GetMenu(); 
     var vm = new ViewModel() {Menu = menu}; 
     return View(vm); 
    } 
    private Menu GetMenu() 
    { 
     var menu = new Menu(); 
     var menuItems = new List<MenuItem>(); 
     menuItems.Add(new MenuItem() { LinkText = "Home" , ActionName = "Index", ControllerName = "Home"}); 
     menuItems.Add(new MenuItem() { LinkText = "About", ActionName = "About", ControllerName = "Home" }); 
     menuItems.Add(new MenuItem() { LinkText = "Help", ActionName = "Help", ControllerName = "Home" }); 
     menu.Items = menuItems; 

     return menu; 
    } 
} 

2)

これはのviewmodel

public class ViewModel 
{ 
    public Menu Menu { get; set; } 
} 

ありますこのビューは、メニューデータをHTMLメニューとしてレンダリングする方法の例です。

@model WebApplication1.Models.ViewModel 

<ul id="menu"> 
    @foreach (var item in @Model.Menu.Items) 
    { 
     <li>@Html.ActionLink(@item.LinkText, @item.ActionName, 
       @item.ControllerName)</li> 
     } 
</ul> 

3)

これは、ここでdbcontextからあなたのエンティティを表す使用例メニュークラス()

public class Menu 
{ 
    public List<MenuItem> Items { get; set; } 
} 

public class MenuItem 
{ 
    public string LinkText { get; set; } 
    public string ActionName { get; set; } 
    public string ControllerName { get; set; } 
} 

では、あなたが始めるためにいくつかのリンクです:

http://www.codeproject.com/Articles/585873/Basic-Understanding-On-ASP-NET-MVC http://www.asp.net/mvc/overview/getting-started/introduction/getting-started

+0

答えに記述されているように部分ビューにロードされたメニューを得ることができましたしかし、アイテムの最初のクリック後、 'Menu.Items'は' null'になり、新しいページをレンダリングしようとするとサイトが壊れます。 –

関連する問題