【问题标题】:ASP.NET MVC 3 RC - Razor "View" PropertyASP.NET MVC 3 RC - 剃刀“视图”属性
【发布时间】:2010-11-10 05:55:56
【问题描述】:

只是在今天发布的 ASP.NET MVC 3 RC 中使用 Razor。

现在,我们有了“布局页面”的概念,我认为它是 ASPX 视图引擎中“视图主控”的替代品。

但我不明白布局页面的“视图”属性。

这是创建新 Razor 视图时创建的示例:

_Layout.cshtml

<html>
<head>
   <title>@View.Title</title>

...

MyView.cshtml

@model Mvc3FunParty.Models.Post

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

这会导致“某些标题”被插入到呈现的 HTML 的 &lt;title&gt; 标记中。

这到底是如何工作的?当我将鼠标悬停在“视图”属性上时,它的类型为“dynamic”。

那么这个属性到底应该用来做什么呢? 我们可以在里面塞东西吗?这应该是 ViewData 的 Razor 实现吗?

如果是这样,它不应该是“ViewDataDictionary”类型吗?为什么 View 属性使用“动态”类型?

【问题讨论】:

  • 另外,在旁注中 - 有人遇到过智能感知问题吗?我使用 Resharper,但检查了 VS2010 中的设置(语句完成)。当我做Model. 时,我得到了智能感知,但没有像我打字那样。
  • 除非您定义模型的类型(通过@model MyModel),否则模型属性将被键入为动态(至少在 C# 中)
  • 此外,Razor 工具并不总是适用于 Resharper。
  • 是的,我正在使用@model MyModel(如问题所示)。 Model 是对象 Post 的强类型。所以这不是问题。但是,如果我键入 Model.Po .. 我会得到任何包含“Po”的属性的智能感知。我必须按 CTRL+。为拿到它,为实现它。哦,好吧,我猜总比没有好。 :)
  • 对于任何关心的人,Razor 智能感知是 Resharper 的一个错误:blogs.jetbrains.com/dotnet/2010/11/… 很快就会有一个修复 - 现在,CTRL-Space。 :(

标签: c# asp.net-mvc-3 viewdata razor


【解决方案1】:

View 属性是ViewData 属性的别名。也就是说下面的代码

View.Title

等价于

ViewData["Title"]

这通过使用 .NET 4 中引入的 C# 语言的新“动态”功能来工作。基本上,它允许您使用迄今为止一直是静态类型语言的后期绑定代码。如果您想了解更多信息,网络上有大量资源。

ViewData 属性仍然可用,您可以互换使用两者。它们都使用相同的后备存储,因此以一种方式进行的更改将以另一种方式可用。

使用View 的好处是语法更简洁。缺点是您没有获得 IntelliSense 支持。

您可以在视图页面中设置View.Title 并在布局页面中显示正确的值是由于Razor 页面的呈现顺序。我们称之为由内而外的渲染,这意味着你的视图页面首先被执行,它的 HTML 输出被收集到一个缓冲区中,然后布局页面被执行,缓冲的视图页面输出被注入到你调用 RenderBody 的地方。

【讨论】:

  • 这是有道理的。我想我也对 TempData 和 ViewData.Model 感到困惑 - 我的理解是 ViewData.Model 允许您动态设置渲染到视图的模型,而不是返回 View(model)。那是对的吗?感谢您的答复。 :)
【解决方案2】:

是的,“视图”实际上是 ViewData,他们使用 dynamic 来获得您所看到的语法 (View.Title)

翻译成

ViewData["Title"]

在 MVC 中,特别是在 MVC 3 中有很多这样的小块,会让你感到困惑:)。

【讨论】:

  • 好的,但我们从未在标记中使用ViewData["Title"] 创建数据,我们在将结果渲染到控制器之前使用它,并在视图中显示值。这就是为什么我很困惑,因为它实际上是在视图本身中创建数据(或者看起来如此)
  • 在 ASP.NET 网页(Razor 的独立版本,就像 WebMatrix 使用的一样)中没有控制器,因此必须内联设置值
  • 另外,我在控制器操作中添加了ViewModel.Title = "Foo",并将其从视图页面中排除,它的值是“Foo”。如果我将代码留在他的视图页面中,它会覆盖控制器设置的值。有趣...
  • 您可以在视图内设置 ViewData 值。 ViewData 从控制器传递到视图,因此在覆盖值时,视图拥有最终决定权。
  • “最后一个”获胜。即顺序或顺序是Controller、View、Layout。因此,如果您在控制器中的 ViewData 中设置一个值,然后在您的视图中将其设置为其他值,您在视图中设置的值将覆盖您之前的值。最后,您的布局页面获取该值并使用它来显示它。这有意义吗?
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多