我有一个布局和一个局部视图,它们位于Shared文件夹中。部分视图显示非静态的顶级菜单项。所以我需要调用一个action方法来从数据库中获取菜单项。为此,我创建了一个控制器并在其中添加了一个动作方法。
当我尝试在网络浏览器中浏览页面时,出现此错误:
路径控制器' /'未找到或未实现IController。
注意: 我也试过Html.RenderAction,Html.Partial方法...... 我尝试创建另一个视图文件夹,并创建一个新的局部视图和新的控制器,用"文件夹名称+控制器"后缀。
布局:
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div id="header">
@Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""}); //Here is the problem.
</div>
<div>
@RenderBody();
</div>
</body>
</html>
_TopMenu.cshtml:
@model IList<string>
@foreach (string item in Model)
{
<span>item</span>
}
LayoutController(在Controllers文件夹中):
public class LayoutController : Controller
{
//
// GET: /Shared/
public ActionResult Index()
{
return View();
}
[ChildActionOnly]
[ActionName("_TopMenu")]
public ActionResult TopMenu()
{
IList<string> menuModel = GetFromDb();
return PartialView("_TopMenu", menuModel);
}
}
答案 0 :(得分:5)
如果你把它放在你的视野中会发生什么?
@{ Html.RenderAction("TopMenu", "Layout"); }
(并注意这一切,直到一切正常:// [ChildActionOnly])
答案 1 :(得分:3)
更改此行,
@Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""});
要,
@Html.Action("_TopMenu", "Layout", new {area =""});
并检查。
答案 2 :(得分:1)
存在不同的方式,对于这种情况我喜欢在布局中使用html.action,而在控件中我将创建一个字符串Menu,该字符串包含我需要的html代码,控制器端返回Content(菜单);
例如
布局:
<body>
<nav>
@Html.Action("_TopMenu", "Layout")
</nav>
控制器
public class LayoutController : Controller
{
public ActionResult _TopMenu()
{
IList<string> menuModel = GetFromDb();
string menu = "<ul>";
foreach(string x in menuModel)
{
menu +="<li><a href='"+x+"'>+x+"</a></li>";
}
menu+="</ul>";
return Content(menu);
}
}
我喜欢这样,因为我可以使用很多选项来创建菜单dinamics更复杂。
其他方式使用ajax恢复数据并使用把手或其他模板代码
答案 3 :(得分:0)