ASP.NET MVC:@section的目的是什么?

时间:2012-10-26 15:06:01

标签: asp.net-mvc

对于ASP.NET MVC应用程序,我看到this blog article。 作者ScottGu将@section添加到Index.cshtml中。

我有几个问题(参考上面的文章):

  • Index.cshtml是共享视图吗?
  • 示例代码在特定视图中使用@section代码。为什么?

有人可以解释为什么以及何时在视图中使用@section

4 个答案:

答案 0 :(得分:124)

@section用于定义从共享视图覆盖的内容。基本上,它是一种调整共享视图的方法(类似于Web窗体中的母版页)。

您可能会找到Scott Gu's write up on this very interesting

编辑:基于其他问题澄清

@RenderSection语法进入共享视图,例如:

<div id="sidebar">
    @RenderSection("Sidebar", required: false)
</div>

然后使用@Section语法将其放在您的视图中:

@section Sidebar{
    <!-- Content Here -->
}

在MVC3 +中,您可以直接定义要用于视图的布局文件,也可以为所有视图设置默认视图。

可以在_ViewStart.cshtml中设置公共视图设置,它定义了与此类似的默认布局视图:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

您还可以将共享视图设置为直接在文件中使用,例如index.cshtml,如此片段所示。

@{
    ViewBag.Title = "Corporate Homepage";
    ViewBag.BodyID = "page-home";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

您可以通过多种方式调整此设置,并在this SO answer中提及更多内容。

答案 1 :(得分:18)

一个很好的例子是Javascript。您希望它位于浏览器中呈现的页面底部,因为这是最佳实践。

如何从基于布局/母版页的视图中执行此操作,您只能访问页面中间?

您可以通过在“布局”页面底部声明“脚本”部分来执行此操作。然后你可以添加内容,在这种情况下Javascript包括(我希望!),从你的View页面到你的布局页面的底部。

答案 2 :(得分:3)

如果希望在布局页面中定义的占位符中呈现一些代码/内容,则需要使用部分。

在您链接的特定示例中,他在_Layout.cshtml中定义了RenderSection。任何使用该布局的视图都可以定义与Layout中定义的同名的@section,它将替换布局中的RenderSection调用。

也许您想知道我们如何知道Index.cshtml使用该布局?这是由于一些MVC / Razor惯例。如果您查看他正在添加视图的对话框,则会选中“使用布局或母版页”框,并在其下方显示“如果在Razor _viewstart文件中设置则保留为空”。它没有显示,但_ViewStart.cshtml文件内部的代码如下:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

viewstart的工作方式是同一目录或子目录中的任何cshtml文件在运行之前都会运行ViewStart。

这告诉我们Index.cshtml使用Shared / _Layout.cshtml。

答案 3 :(得分:2)

它允许您在模板中定义@Section代码,然后您可以将其包含在其他文件中。例如,模板中定义的侧边栏可以在另一个包含的视图中引用。

//This could be used to render a @Section defined as @Section SideBar { ...
@RenderSection("SideBar", required: false);

希望这有帮助。