ASP.NET MVC: знает ли частичный, запрашивается ли он с другой страницы? - PullRequest
6 голосов
/ 28 июля 2011

У меня есть частичное представление, которое может быть запрошено с помощью действия (Action2 на изображении ниже) или отображено на другой странице с помощью «Html.Action ()» (Action1 на изображении ниже). Из частичного (или контроллера частичного) есть способ определить, какой из этих двух методов использовался для визуализации страницы?

enter image description here

Ответы [ 5 ]

9 голосов
/ 28 июля 2011

Вы можете использовать ControllerContext.IsChildAction или проверить DataTokens, есть ли что-то с ключом "ParentActionViewContext", если у вас нет доступа к ControllerContext.

1 голос
/ 04 января 2018

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

ie.

return PartialView("MyView.cshtml");

приведет к макету с необходимыми полосами меню и другими элементами сайта.

и

@Html.Partial("MyView")

просто вставят содержимое без добавленияостальная часть страницы.

так, в макете моей страницы по умолчанию у меня есть:

@if (this.IsPartial()) {
    Layout = null;
} else {
    Layout = "_SiteLayout";
}
@RenderBody()

вот что я нашел:

public static bool IsPartialResult(this WebPageBase @this)
{
    return !@this.OutputStack.Any(writer => writer is HttpWriter);
}

это, вероятно, не будетработать в любых ситуациях.но это работает для меня.YMMV / НТН

1 голос
/ 28 июля 2011

Следует отметить, что делать подобные вещи в MVC не очень хорошая практика. Частичное не должно беспокоиться о его «родителе» ... но если вам нужно сделать это по какой-то причине ...

Вы можете использовать этот код в контроллере частичного представления, чтобы определить, был ли он загружен напрямую или включен в другую страницу.

// this is the route which was originally used to route the request
string req_controller = Request.RequestContext.RouteData.Values["controller"].ToString();
string req_action = Request.RequestContext.RouteData.Values["action"].ToString();

// this is the route which was used to route to this action/view
string this_controller = RouteData.Values["controller"].ToString();
string this_action = RouteData.Values["action"].ToString();

if (req_controller == this_controller && req_action == this_action)
{
  // this partial was loaded directly
}
else
{
  // this partial was loaded indirectly
}
1 голос
/ 28 июля 2011

Вы должны быть в состоянии получить его от

HttpContext.Current.Request.RawUrl
0 голосов
/ 28 июля 2011

Нет, пути нет, и частичному не нужно знать это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...