为了在MVC3Razor中渲染我的菜单,我在Home控制器中有一个菜单操作: public ActionResult Menu() {...}这个操作获取菜单项并使用视图渲染它们。在_Layout中,我使用:@Html.Action(" menu ","Home")来呈现菜单。这可以很好地工作。
我的问题是我想选择当前的项目。为此,呈现菜单中的菜单项的每个操作都会将所选菜单项添加到ViewBag。问题是ViewBag在菜单操作中是空的。这是正确的方法吗?我想使用控制器+视图呈现一个菜单,而不仅仅是一个视图。我想这样做是为了避免在视图代码中有逻辑代码,并能够测试它。
你知道更好的方法吗?
如何将数据从_Layout.cshtml传递到使用@html.Action呈现的操作?
发布于 2011-10-17 21:35:52
您可以将其作为参数进行传递:
@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
...
}发布于 2011-10-17 21:34:23
在构造菜单时,尝试从操作方法内部查看RouteData,如果是在HtmlHelper扩展中,则查看ViewContext。拉出哪个是当前控制器,哪个是当前操作,并相应地设置该菜单项。
来自动作方法的:
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"];发布于 2011-10-17 21:39:27
这是我之前编写的一个帮助程序,用于将css类打印到活动菜单:http://blog.tomasjansson.com/2010/09/asp-net-mvc-helper-for-active-tab-in-tab-menu/。
https://stackoverflow.com/questions/7794508
复制相似问题