为了在MVC 3 Razor中渲染我的菜单,我在Home控制器中有一个Menu动作:public ActionResult Menu(){...} 此操作获取菜单项并使用视图呈现它们。在_Layout中我使用:@ Html.Action(“Menu”,“Home”)来渲染菜单。这很好。
我的问题是我想选择当前项目。为此,呈现菜单中项目的每个操作都将向ViewBag添加所选菜单项。问题是View菜单中的ViewBag为空。 这是正确的方法吗?我想使用控制器+视图渲染菜单,而不仅仅是视图。我想要这样做是为了避免在视图代码中使用逻辑代码并能够测试它。
你知道更好的方法吗?
如何将_Layout.cshtml中的数据传递给我使用@html.Action渲染的动作?
答案 0 :(得分:2)
您可以将其作为参数传递:
@Html.Action("Menu", "Home", new { sleectedItem = (string)ViewBag.SomeItem })
然后在子控制器操作中使用:
public ActionResult Menu(string selectedItem)
{
...
}
或者如果您只需要获取当前控制器和操作,您只需从RouteData获取此信息并删除任何ViewBag:
public ActionResult Menu()
{
var rd = ControllerContext.ParentActionViewContext.RouteData;
var action = rd.GetRequiredString("action");
var controller = rd.GetRequiredString("controller");
// Now that you know the action and the controller build up your view model
// and pass to the view. It will then know which menu item to preselect
...
}
答案 1 :(得分:1)
在构建菜单时,请尝试查看操作方法中的RouteData
或ViewContext
内的HtmlHelper
扩展名。拉出哪个是当前控制器,哪个是当前操作并相应地设置该菜单项。
从行动方式:
object controller = RouteData.Values["controller"];
object action = RouteData.Values["action"];
object area = RouteData.DataTokens["area"];
来自html帮助器:
object controller = helper.ViewContext.RouteData.Values["controller"];
object action = helper.ViewContext.RouteData.Values["action"];
object area = helper.ViewContext.RouteData.DataTokens["area"];
答案 2 :(得分:0)
这是一个帮助,我写了一段时间,将css类打印到活动菜单:http://blog.tomasjansson.com/2010/09/asp-net-mvc-helper-for-active-tab-in-tab-menu/