Asp.net mvc MVC 3渲染菜单
为了在MVC 3 Razor中呈现我的菜单,我在主控制器中有一个菜单操作:public ActionResult menu(){…} 此操作获取菜单项并使用视图渲染它们。在_布局中,我使用@Html.Action(“Menu”、“Home”)来呈现菜单。这个很好用 我的问题是我想选择当前项目。为此,渲染菜单中某个项目的每个操作都会将选定的菜单项添加到ViewBag中。问题是ViewBag在菜单操作中为空。 这是正确的方法吗?我想使用控制器+视图而不仅仅是视图来渲染菜单。我希望这样做是为了避免视图代码中包含逻辑代码,并能够对其进行测试 你知道更好的方法吗Asp.net mvc MVC 3渲染菜单,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,为了在MVC 3 Razor中呈现我的菜单,我在主控制器中有一个菜单操作:public ActionResult menu(){…} 此操作获取菜单项并使用视图渲染它们。在_布局中,我使用@Html.Action(“Menu”、“Home”)来呈现菜单。这个很好用 我的问题是我想选择当前项目。为此,渲染菜单中某个项目的每个操作都会将选定的菜单项添加到ViewBag中。问题是ViewBag在菜单操作中为空。 这是正确的方法吗?我想使用控制器+视图而不仅仅是视图来渲染菜单。我希望这样做是为了避免视图
如何将数据从_Layout.cshtml传递到使用@html.action呈现的操作?在构建菜单时,尝试从操作方法内部查看
routedData
,或者在HtmlHelper
扩展中查看ViewContext
。拉出当前控制器和当前操作,并相应地设置该菜单项
来自动作方法:
object controller = RouteData.Values["controller"];
object action = RouteData.Values["action"];
object area = RouteData.DataTokens["area"];
object controller = helper.ViewContext.RouteData.Values["controller"];
object action = helper.ViewContext.RouteData.Values["action"];
object area = helper.ViewContext.RouteData.DataTokens["area"];
来自html帮助程序:
object controller = RouteData.Values["controller"];
object action = RouteData.Values["action"];
object area = RouteData.DataTokens["area"];
object controller = helper.ViewContext.RouteData.Values["controller"];
object action = helper.ViewContext.RouteData.Values["action"];
object area = helper.ViewContext.RouteData.DataTokens["area"];
您可以将其作为参数传递:
@Html.Action("Menu", "Home", new { sleectedItem = (string)ViewBag.SomeItem })
然后在子控制器操作中使用以下命令:
public ActionResult Menu(string selectedItem)
{
...
}
或者,如果您只需要获取当前控制器和操作,您只需从RoutedData获取此信息,并删除任何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
...
}
这是我不久前编写的一个助手,用于将css类打印到活动菜单中:这种方法不起作用。控制器是“主页”,操作是“菜单”。。。看起来Html.Action覆盖了路由数据项。我想不出需要从Action方法调用它的原因。为什么不渲染部分并将其连接到那里,或者传入一个模型对象?