如何从Child动作中获取当前控制器和动作?

时间:2010-12-10 18:58:22

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

我的视图的一部分是通过RenderAction调用子动作呈现的。如何从此子操作中获取父控制器和操作。

当我使用..

@ViewContext.RouteData.Values["action"]

我找回了Child Action的名字,但我需要的是Parent / Calling动作。

由于

BTW我正在使用MVC 3和Razor。

5 个答案:

答案 0 :(得分:73)

如果你想从子动作本身(而不是视图)中访问它,你可以使用

ControllerContext.ParentActionViewContext.RouteData.Values["action"] 

答案 1 :(得分:22)

发现它......

how-do-i-get-the-routedata-associated-with-the-parent-action-in-a-partial-view

ViewContext.ParentActionViewContext.RouteData.Values["action"]

答案 2 :(得分:16)

如果partial在另一个partial中,除非找到最顶层的父视图内容,否则这将不起作用。您可以通过以下方式找到它:

var parentActionViewContext = ViewContext.ParentActionViewContext;
while (parentActionViewContext.ParentActionViewContext != null)
{
    parentActionViewContext = parentActionViewContext.ParentActionViewContext;
}

答案 3 :(得分:1)

我遇到了同样的问题并提出了与Carlos Martinez相同的解决方案,除了我把它变成了扩展名:

public static class ViewContextExtension
{
    public static ViewContext TopmostParent(this ViewContext context)
    {
        ViewContext result = context;
        while (result.ParentActionViewContext != null)
        {
            result = result.ParentActionViewContext;
        }
        return result;
    }
}

我希望这会帮助那些遇到同样问题的人。

答案 4 :(得分:0)

使用模型绑定来获取操作名称,控制器名称或任何其他URL值:

routes.MapRoute("City", "{citySlug}", new { controller = "home", action = "city" });

[ChildActionOnly]
public PartialViewResult Navigation(string citySlug)
{
    var model = new NavigationModel()
    {
        IsAuthenticated = _userService.IsAuthenticated(),
        Cities = _cityService.GetCities(),
        GigsWeBrought = _gigService.GetGigsWeBrought(citySlug),
        GigsWeWant = _gigService.GetGigsWeWant(citySlug)
    };

    return PartialView(model);
}