如何从子动作内部获取当前控制器和动作?

Posted

技术标签:

【中文标题】如何从子动作内部获取当前控制器和动作?【英文标题】:How to get current controller and action from inside Child action? 【发布时间】:2010-12-10 18:58:21 【问题描述】:

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

当我使用..

@ViewContext.RouteData.Values["action"]

我得到了子操作的名称,但我需要的是父/调用操作。

谢谢

顺便说一句,我正在使用带有 Razor 的 MVC 3。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

对于任何对此答案和 JBeckton 的答案感到困惑的人来说,区别在于您是从控制器内部还是从视图内部获取此值。根据需要使用 ControllerContext 或 ViewContext 进行匹配。给定代码的起始 @ 符号,原始问题似乎是在视图中使用它。【参考方案2】:

找到了……

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

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

【讨论】:

【参考方案3】:

如果部分在另一个部分中,除非我们找到最顶层的父视图内容,否则这将不起作用。你可以用这个找到它:

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

    parentActionViewContext = parentActionViewContext.ParentActionViewContext;

【讨论】:

【参考方案4】:

我遇到了与 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;
    

我希望这能帮助其他有同样问题的人。

【讨论】:

【参考方案5】:

使用模型绑定来获取操作名称、控制器名称或任何其他 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);
    

【讨论】:

以上是关于如何从子动作内部获取当前控制器和动作?的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC3 中,如何获取当前的动作名称?

Yii2 - 获取控制器的动作但是使用url

Rails 5,动作电缆和 current_user

csharp 获取控制器中的所有动作和描述

使用Route属性在Controller方法中获取控制器和动作名称

Grails with SpringSecurity,检查当前用户是不是可以访问控制器/动作