MVC 3渲染菜单

时间:2011-10-17 13:31:30

标签: asp.net-mvc asp.net-mvc-3

为了在MVC 3 Razor中渲染我的菜单,我在Home控制器中有一个Menu动作:public ActionResult Menu(){...} 此操作获取菜单项并使用视图呈现它们。在_Layout中我使用:@ Html.Action(“Menu”,“Home”)来渲染菜单。这很好。

我的问题是我想选择当前项目。为此,呈现菜单中项目的每个操作都将向ViewBag添加所选菜单项。问题是View菜单中的ViewBag为空。 这是正确的方法吗?我想使用控制器+视图渲染菜单,而不仅仅是视图。我想要这样做是为了避免在视图代码中使用逻辑代码并能够测试它。

你知道更好的方法吗?

如何将_Layout.cshtml中的数据传递给我使用@html.Action渲染的动作?

3 个答案:

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

在构建菜单时,请尝试查看操作方法中的RouteDataViewContext内的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/