Reputation: 2643
When I create a new ASP.NET 4.5 web application MVC in Visual Studio, it starts with a introduction template.
The relavant parts are:
Views/Home/About.cshtml
@{
ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>
...
Views/Shared/_Layout.cshtml
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title - My ASP.NET Application</title>
...
@RenderBody()
...
Views/_ViewStart.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
If I understand right, and assuming the About page is opened in the browser:
The _ViewStart.cshtml is called first, and it says there is a layout _Layout.cshtml to be called.
It renders the _Layout.cshtml, until the call @RenderBody() is reached, on that point he will render the About.cshtml. When that ends, he will render the rest of the _Layout.cshtml.
But here is my doubt, if the _Layout.cshtml starts first, how does it print on the <title>
the variable @ViewBag.Title
, which is assigned only in About.cshtml?
Upvotes: 0
Views: 1138
Reputation: 29754
When you hit a URL an Action is called on a controller. The view is a result of this, so you don't call views directly (my guess is your coming from a webforms background where you call an aspx page, MVC uses a different model that doesn't rely on physical files). The action then specifies which view to render (and passes it the model). This view then specifies a layout to use when rendering the view.
So the control mechanism is inverted compared to what your used to.
URL (via routing) specifies a controller and an action -> the action says render me using this view -> the view then says render me using this layout. So the hierachy is:
So to answer your specific questions:
But here is my doubt, if the _Layout.cshtml starts first, how does it print on the
<title>
the variable@ViewBag.Title
, which is assigned only in About.cshtml?
The layout isn't called first, the view specifies a layout that should be used to render itself.
Upvotes: 3
Reputation: 536
It doesn't. The View is rendered before the layout.
Upvotes: -1