140

对于 ASP.NET MVC 应用程序,我看到了这篇博客文章。作者 ScottGu 添加@section到 Index.cshtml。

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

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

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

4

4 回答 4

144

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

您可能会发现Scott Gu 对此的文章非常有趣

编辑:基于额外的问题澄清

语法进入@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";
}

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

于 2012-10-26T15:11:20.150 回答
21

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

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

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

于 2012-10-26T15:11:33.967 回答
4

当您希望在布局页面中定义的占位符中呈现一些代码/内容时,您希望使用部分。

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

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

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

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

这就是告诉我们 Index.cshtml 使用 Shared/_Layout.cshtml 的原因。

于 2012-10-26T18:02:53.010 回答
3

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

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

希望这可以帮助。

于 2012-10-26T15:14:29.333 回答