在今天发布的ASP.NET MVC 3 RC中使用Razor。
现在,我们有一个“布局页面”的概念,我认为它取代了ASPX视图引擎中的“View Master”。
但是我不理解布局页面的“视图”属性。
以下是创建新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";
}
这导致“某些标题”被插入到呈现的HTML的<title>
标记中。
这究竟如何运作?当我将鼠标悬停在“查看”属性上时,它的类型为“动态”。
那么这个属性究竟应该用于什么? 我们可以在那里塞东西吗?这应该是ViewData的Razor实现吗?
如果是这样,它不应该是“ ViewDataDictionary ”类型吗?为什么View属性的“动态”类型?
答案 0 :(得分:4)
View
属性是ViewData
属性的别名。这意味着以下代码
View.Title
相当于
ViewData["Title"]
这可以通过使用.NET 4中引入的C#语言的新“动态”特性来实现。基本上它允许您编写后期绑定代码,直到现在已经是静态类型语言。如果您想了解更多信息,网络上有大量资源。
ViewData
属性仍然可用,您可以互相使用。它们都使用相同的后备存储,因此以一种方式进行的更改将以另一种方式提供。
使用View
的优点是语法更简洁。缺点是您没有获得IntelliSense支持。
您可以在视图页面中设置View.Title
并在布局页面中显示正确值的原因是由于Razor页面的渲染顺序。我们将其称为内向外渲染,这意味着首先执行视图页面,将HTML输出收集到缓冲区中,然后执行布局页面,并在调用{{1}的地方注入缓冲的视图页面输出}。
答案 1 :(得分:1)
是的,“查看”确实是ViewData
,他们正在使用dynamic
,以便拥有您所看到的语法(View.Title
)
转换为
ViewData["Title"]
MVC中有很多像这样的小块,特别是在MVC 3中会让你感到困惑:)。