6

我正在积极开发桌面应用程序、本地和网络服务、一些经典的ASP.NET等,所以我习惯于静态编译和静态代码分析。现在我(终于)学习了ASP.NET MVC 3.0,我看到许多 ASP.NET MVC 专家和经验丰富的开发人员都建议在 ASP.NET MVC 3.0(如果适用)中使用强类型视图。

我猜“强类型”意味着@model=...在视图代码的顶部编写。但在这样做时,我只让IntelliSense工作,没有进行静态代码检查。我可以在cshtml@model的语句中写任何我想要的东西,它会编译和运行。因此,也可以编译。事实上,如果我输入@model,我可以动态地使用任何我想要的具有“兼容”属性和方法的模型。Model.Anything

我习惯于“强类型”,意思是“不会编译”,就像 LINQ 一样,如果你没有得到正确的属性,任何东西都不会编译。@model除了 IntelliSense 和运行时错误之外,还有其他用途吗?如果实际上不是,为什么将其称为强类型?

强类型化,计算机文学中的意义

4

3 回答 3

3

默认情况下,视图在运行时编译。您可以通过设置以下属性来修改项目文件 (csproj) 以在应用程序构建时编译视图:

<MvcBuildViews>true</MvcBuildViews>

这种方法的缺点是您的构建时间将显着增加。对于发布版本,您应该考虑仅将此选项设置为 true。

您可以通过卸载项目来编辑项目文件,右键单击项目并选择 Edit ProjectFile

于 2011-06-30T07:18:45.063 回答
0

可以设置您的项目,使其在您的编译中包含视图。这将是静态类型有用的地方。另一个地方是在运行时,如果你尝试传入一个与预期模型不匹配的模型,你会立即得到一个异常。如果您要动态键入视图,那么您不会知道您的模型无效,直到您的视图尝试访问模型的属性并发现它不存在。

如果您传入了错误的模型对象,但它恰好具有与预期模型相同的命名属性,那么第二种情况也是一场噩梦。然后你只会得到无效的数据,调试就变成了地狱。

于 2011-06-06T17:50:37.500 回答
0

model 是 .net 4.0 中的新动态类型,因此这些类型在运行时而不是在编译时得到解析。

于 2011-06-26T12:41:59.563 回答