如何使用@RenderBody()?

时间:2019-02-06 09:50:57

标签: asp.net-mvc model-view-controller

我是ASP.NET MVC的新手。我在Internet上获得了一个模板,并在我的mvc根项目中成功实现了该模板。但是,当我将@Renderbody()...放在放置它的区域中时,它将对官方microsoft模板和创建MVC项目时的原始模板进行“渲染”。 有人可以告诉我为什么会这样吗?

Layout RenderBody()

what happens

1 个答案:

答案 0 :(得分:0)

在Razor中,有两种视图:常规.cshtml文件和布局(与ASPX页面不同,母版页带有后缀.master)也具有以下两种视图:后缀.cshtml,但是通常它们不是直接从控制器呈现的,但是您必须指定页面的布局:

@{
  Layout = "_Layout";
}

然后,像任何视图一样,Razor将在当前目录和目录_Layout.cshtml中查找/Views/Shared。如果设置Layout = null;,则页面将没有布局。

此代码也可以位于/Views/_ViewStart.cshtml,因为按照惯例,该文件中的任何代码都将在视图中的代码之前之前运行(因此,您可以覆盖在中指定的布局)该文件从视图中删除。)

当Razor Engine应该使用布局渲染视图时,它仅渲染布局。但是,如果在调用方法RenderBody()时,它将呈现视图并将其放在RenderBody()的调用位置。

有一个类似的方法RenderSection(),它呈现视图的单个部分。看一下<head>的{​​{1}}元素:

_Layout.cshtml

<html> <head> <!-- ... --> @RenderSection("scripts", required: false) <!-- ... --> </head> <!-- ... --> </html> 的调用将呈现RenderSection()部分。参数scripts指定casn是一个没有required: false部分的视图;没有它,这样的视图将触发运行时错误。

现在,请查看以下视图:

scripts

<div>Some View</div> 的呼叫将替换为RenderBody()

但是,如果视图如下所示:

<div>Some View</div>

然后,<div>Some View</div> @section scripts { <script src="jsfile.js"></script> } 将相同,但是呼叫RenderBody()将被RenderSection("scripts", ...)取代。部分使您可以创建主要内容,也可以创建次要内容,例如标题,特殊脚本/样式等。

一些评论:布局也可以有布局-它使您能够创建嵌套页面(例如在公司中)-主布局,营销类的特殊布局,管理部分的布局...