#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
Вы можете добавлять данные представления для каждого дополнительного шаблона, который вам нужен.