从ASP.NET MVC中的布局调用操作方法

时间:2014-10-29 12:35:37

标签: c# .net asp.net-mvc asp.net-mvc-4 partial-views

我有一个布局和一个局部视图,它们位于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);
        }    
    }

4 个答案:

答案 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)

您正在使用Action-Method的错误重载。变体中的第二个参数不是控制器名称,而是操作名称。

您可以在此page

上查看正确的方法重载

另外:如果在Html.Action方法中指定控制器(例如,可以使用方法的this变体),则不需要编写后缀“Controller”,即使这是您的类名。因此,不要使用字符串“LayoutController”,而只需编写“Layout”。

此时框架是基于惯例的。