Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC 3渲染菜单_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc MVC 3渲染菜单

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在菜单操作中为空。 这是正确的方法吗?我想使用控制器+视图而不仅仅是视图来渲染菜单。我希望这样做是为了避免视图

为了在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方法调用它的原因。为什么不渲染部分并将其连接到那里,或者传入一个模型对象?