ASP.NET MVC _layout变量如何工作?

时间:2016-02-15 16:44:23

标签: c# asp.net asp.net-mvc asp.net-mvc-4

当我在Visual Studio中创建一个新的ASP.NET 4.5 Web应用程序MVC时,它从一个介绍模板开始。

相关部分是:

查看/主页/ About.cshtml

@{
    ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>
...

查看/共享/ _Layout.cshtml

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title - My ASP.NET Application</title>
...
    @RenderBody()
...

查看/ _ViewStart.cshtml

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

如果我理解正确,并假设在浏览器中打开了“关于”页面:

  • 首先调用 _ViewStart.cshtml ,它表示要调用 _Layout.cshtml 布局。

  • 它会呈现 _Layout.cshtml ,直到达到 @RenderBody()的调用,此时他将呈现 About.cshtml 即可。当结束时,他将呈现 _Layout.cshtml 的其余部分。

但我怀疑,如果 _Layout.cshtml 首先启动,它如何在<title>变量@ViewBag.Title上打印,该变量仅在 About.cshtml

2 个答案:

答案 0 :(得分:3)

点击网址时,控制器上会调用操作。视图是这样的结果,所以你不直接调用视图(我的猜测是你来自webforms背景,你调用aspx页面,MVC使用不依赖于物理文件的不同模型)。然后,操作指定要渲染的视图(并将模型传递给它)。然后,此视图指定渲染视图时要使用的布局。

因此,与您习惯的相比,控制机制被颠倒了。

URL(通过路由)指定控制器和操作 - &gt;动作说让我使用这个视图 - &gt;然后视图说使用此布局渲染我。所以层次结构是:

  • 控制器
  • 动作
  • 查看
  • 布局

所以回答你的具体问题:

  

但是我怀疑,如果_Layout.cshtml首先启动,它是怎么回事   在<title>打印已分配的变量@ViewBag.Title   只在About.cshtml?

首先不调用布局,视图指定应该用于渲染自身的布局。

答案 1 :(得分:-1)

没有。视图在布局之前呈现。