2016-06-20 3 views
1

Я читал некоторые похожие темы здесь и в Интернете, но я не думаю, что видел один, который бы классифицировал это как дубликат, поэтому я собираюсь пойти и опубликовать его. Я в настоящее время загрузка моего динамическое меню из базы данных следующим образом:Динамические меню из базы данных в 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() в моем классе контроллера, так что я не в состоянии (к моему знанию), чтобы использовать синтаксис Razor. Я предпочел бы вместо этого загружать меню из представления, так что я могу использовать @Html.ActionLink(linkText, actionName, controllerName). Загружая HTML, как я это делаю, он будет генерировать другой текст ссылки в зависимости от текущего контроллера, поэтому ссылки не всегда отображаются правильно. Можно ли получить доступ к базе данных из представления? Или, возможно, просто передать содержимое из базы данных с контроллера в представление и затем отобразить меню таким образом?

+2

Если вы хотите использовать бритву, создайте PartialView и сделать LoadMenus результатом действия и «вернуть PartialView (« _ Menu », меню);' в вашем Partial View вы можете прокручивать свой «@model IEnumerable

» и создавать свое меню. Просто поместите '@ Hmtl.Action (« LoadMenus »)' где вы хотите меню – JamieD77

+0

А, я думаю, что бит '@ model', возможно, был тем, что я ищу. Я мог использовать частичное представление для меню, но до сих пор не знал, как получить доступ к информации из представления. –

+0

Я также смог сгенерировать ссылки и указать контроллер с помощью 'Url.Action()' like so: '$ '{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', и сайт ломается, когда он пытается отобразить новую страницу. –

 Смежные вопросы

  • Нет связанных вопросов^_^