我正在使用c#编写使用ASP.NET MVC 5的应用程序。我需要在应用程序的右上角添加一个全局菜单。我被告知other SO要使用ChildActionOnly
属性的操作。
所以这就是我所做的。
我创建了一个这样的BaseController
public class BaseController : Controller
{
[ChildActionOnly]
public ActionResult ClientsMenu()
{
using (SomeContext db = new SomeContext())
{
return PartialView(db.Database.SqlQuery<Client>("SELECT * FROM clients").ToList());
}
}
}
然后我从BaseController
继承了我的所有控制器
public class TasksController : BaseController
{
public ActionResult Index(int ClientId)
{
...
return View();
}
public ActionResult Show(int SurveyId)
{
...
return View();
}
}
要在我的布局中呈现ClientsMenu
,我添加了以下代码
@Html.Action("ClientsMenu", "Menus")
现在,当我运行我的应用程序时,我收到以下错误
The controller for path '/Tasks/Index' was not found or does not implement IController.
当我从布局中删除@Html.Action("ClientsMenu", "Menus")
时,一切正常,但当然不会显示全局菜单。
我该怎么做才能解决这个问题?
更新 以下是我从以下评论中得到的反馈后所做的事情
public class TasksController : Controller
{
[ChildActionOnly]
public ActionResult ClientsMenu()
{
using (SomeContext db = new SomeContext())
{
return PartialView(db.Database.SqlQuery<Client>("SELECT * FROM clients").ToList());
}
}
public ActionResult Index(int ClientId)
{
...
return View();
}
public ActionResult Show(int SurveyId)
{
...
return View();
}
}
但仍然是同样的错误
答案 0 :(得分:0)
从ClientMenus
中取出BaseController
动作并将其放入自己的控制器MenusController
。然后,您可以从视图中调用该控制器。
@Html.Action("ClientsMenu", "Menus")
在您的示例中,您没有MenusContoller
@Html.Action("ClientsMenu", "Menus")
正在寻找的内容。
另一篇帖子链接的Phil Haacked - Html.RenderAction and Html.Action文章为您提供了一个很好的示例。