【问题标题】:ASP.NET 3: What is a way to know what views and layouts are used?ASP.NET 3:有什么方法可以知道使用了哪些视图和布局?
【发布时间】:2011-04-11 16:39:57
【问题描述】:

有以下布局和视图:

_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 将使用有关已使用布局和已使用视图的信息返回一些内容。

我该如何实现这个方法?

【问题讨论】:

  • 在方法中我想得到一个类似的列表:
  • _GlobalLayout.cshtml _SubLoyout.cshtml SomePage.cshtml
  • 不幸(也令人惊讶),如果没有反思,这似乎是不可能的。

标签: asp.net-mvc razor html-helper webpage


【解决方案1】:

当前视图的概念没有意义。您尚未渲染主体 (@RenderBody()) 并希望获得视图名称?您可以从ViewContext 获取当前操作和控制器:

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

但主要问题仍然存在:您为什么需要这个以及您想用它来实现什么?

【讨论】:

  • 确实有道理。当前视图是输出/部分堆栈中的第二个视图。此外,它的主体已经渲染(到_tempWriter
  • 这只是我们在构建 MVC 应用程序时不应该依赖的 Razor 实现细节。
  • 问:你为什么需要这个,你想用它来实现什么? A:在我的例子中,我正在实现一个基本的 CMS,我需要在最终视图中加载一些页面内容,并理想地实现这几个嵌套的“主”模板,这样我就知道要加载哪个模板内容。有没有办法获取父布局名称?
【解决方案2】:

您可以在 PagesController 中设置值:

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

然后在您的模板视图中:

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

您可以为所需的每个额外模板添加视图数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多