我在这里和网上都阅读了一些类似的主题,但我认为我没有看到过将其归类为重复的内容,所以我将继续发布它。我目前正在从数据库加载动态菜单,如下所示:
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将根据当前控制器生成不同的链接文本,因此链接并不总是正确呈现。是否可以从视图中访问数据库?或者也许只是将数据库中的内容从控制器传递到视图,然后以这种方式呈现菜单?
答案 0 :(得分: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