ASP.NET 3: Каков способ узнать, какие представления и макеты используются?

#asp.net-mvc #razor #html-helper #webpage

#asp.net-mvc #razor #html-помощник #HTML

Вопрос:

Существуют следующие компоновки и представления:

_GlobalLayout.cshtml

_SubLoyout.cshtml

SomePage.cshtml

В _GlobalLayout.cshtml я хочу получить список всех используемых макетов и название текущего представления.

Например, в _GlobalLayout.cshtml:

 <html>
 <head>
   @Html.Some_method_that_will_know_about_used_layouts_and_view();
 </head>
 <body>
   @RenderBody();
 </body>
</html>
  

Some_method_that_will_know_about_used_layouts_and_view вернет некоторый контент, используя информацию об используемых макетах и используемом представлении.

Как я могу реализовать этот метод?

Комментарии:

1. В методе я хочу получить список, подобный:

2. _GlobalLayout.cshtml _SubLoyout.cshtml SomePage.cshtml

3. К сожалению (и удивительно), это кажется невозможным без отражения.

Ответ №1:

Понятие текущего представления не имеет смысла. Вы еще не отрисовали тело ( @RenderBody() ) и ожидаете получить название вида? Вы могли бы получить текущее действие и контроллер, хотя из ViewContext :

 @{
    var currentController = ViewContext.RouteData.GetRequiredString("controller");
    var currentAction = ViewContext.RouteData.GetRequiredString("action");
}
  

Однако остается главный вопрос: зачем вам это нужно и чего вы пытаетесь достичь с его помощью?

Комментарии:

1. Это действительно имеет смысл. Текущее представление является вторым в стеках выходных данных / разделов. Кроме того, его тело уже отрисовано (для _tempWriter )

2. Это всего лишь деталь реализации Razor, на которую нам не следует полагаться при создании приложения MVC.

3. В: зачем вам это нужно и чего вы пытаетесь достичь с его помощью? О: В моем случае я внедряю базовую CMS, где мне нужно загрузить некоторое содержимое страницы в конечном виде и в идеале реализовать это с помощью пары вложенных «основных» шаблонов, чтобы я знал, какое содержимое шаблона загружать. Нет ли способа получить имена родительских макетов?

Ответ №2:

Вы могли бы задать значения в PagesController:

 Function YourPage() As ActionResult
    ViewData("NeedToLoadOtherTemplates") = True
    Return YourPage()
End Function
  

Затем в вашем представлении шаблона:

 @If ViewData("NeedToLoadOtherTemplates") Then
    @loadTheOtherStuff
End If
  

Вы можете добавлять данные представления для каждого дополнительного шаблона, который вам нужен.