Как получить текущий контроллер и действие внутри действия ребенка?


У меня есть часть моего представления, которая отображается с помощью RenderAction вызова дочернего действия. Как я могу получить Родительский контроллер и действие изнутри этого дочернего действия.

когда я использую..

@ViewContext.RouteData.Values["action"]

Я возвращаю имя дочернего действия, но мне нужно родительское/вызывающее действие.

спасибо

кстати я использую MVC 3 с бритвой.

5 54

5 ответов:

и если вы хотите получить доступ к этому внутри себя ребенка (а не смотреть) вы можете использовать

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

нашли его...

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

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

Если частичное находится внутри другого частичного, это не будет работать, если мы не найдем самое верхнее содержимое родительского представления. Вы можете найти его с помощью этого:

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

У меня была та же проблема, и я придумал то же решение, что и Карлос Мартинес, за исключением того, что я превратил его в расширение:

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

Я надеюсь, что это поможет другим, кто имеет ту же проблему.

используйте привязку модели, чтобы получить имя действия, имя контроллера или любые другие значения 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);
}