ASP.NET MVC 3 RC - Razor "View" Property
Just mucking around with Razor in the ASP.NET MVC 3 RC released today.
Now, we have a concept of a "Layout Page", which i presume is the replacement of the "View Master" in the ASPX view engine.
But i do not understand the "View" property of the layout page.
Here is the example which is created when you create a new Razor View:
_Layout.cshtml
<html>
<head>
<title>@View.Title</title>
...
MyView.cshtml
@model Mvc3FunParty.Models.Post
@{
View.Title = "Some Title";
Layout = "~/Views/Shared/_Layout.cshtml";
}
Which results in "Some Title" being inserted into the <title>
tag of the rendered HTML.
How on earth does this work? When i hover over the "View" property, it's of type "dynamic".
So what exactly should this property be used for? Can we stuff anything in there? Is this supposed to be the Razor implementation of ViewData?
And if so, shouldn't it be of type "ViewDataDictionary"? Why the "dynamic" type for the View prope开发者_如何学Pythonrty?
The View
property is an alias for the ViewData
property. That means that the following code
View.Title
is equivalent to
ViewData["Title"]
This works by using the new 'dynamic' feature of the C# language introduced in .NET 4. Basically it allows you to write late-bound code in what has until now been a statically-typed language. There's plenty of resources on the web if you want to learn more.
The ViewData
property is still available and you can use both interchangaebly. They both use the same backing storage so changes made one way will be available the other way.
The advantage of using View
is more concise syntax. The disadvantage is that you do not get IntelliSense support.
The reason why you can set View.Title
in your view page and the correct value shows up in the layout page is due to the rendering order of Razor pages. We call it the inside-out rendering, which means that your view page gets executed first, it's HTML output gets collected into a buffer, then the layout page gets executed, and the buffered view page output gets injected where you call RenderBody
.
Yes, "View" is really ViewData
and they're using dynamic
so as to have the syntax you're seeing (View.Title
)
It translates to
ViewData["Title"]
Lots of little nuggets like this in MVC and specially in MVC 3 that will confuse you :).
精彩评论