Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC 3.0-如果不进行静态编译,为什么在视图中使用强类型模型?_Asp.net Mvc 3_Strong Typing_Type Safety_Strongly Typed View - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC 3.0-如果不进行静态编译,为什么在视图中使用强类型模型?

Asp.net mvc 3 ASP.NET MVC 3.0-如果不进行静态编译,为什么在视图中使用强类型模型?,asp.net-mvc-3,strong-typing,type-safety,strongly-typed-view,Asp.net Mvc 3,Strong Typing,Type Safety,Strongly Typed View,我正在积极开发桌面应用程序、本地和网络服务、一些经典的ASP.NET等,所以我习惯于静态编译和静态代码分析。现在我(终于)了解到,许多ASP.NET MVC专家和经验丰富的开发人员都建议在ASP.NET MVC 3.0(如果适用)中使用强类型视图 我猜“强类型”意味着在视图代码的顶部写@model=…。但在这样做时,我只开始工作,没有进行静态代码检查。我可以在中的@model语句中编写我想要的任何内容,它将编译并运行。因此,Model.Anything也会编译。事实上,如果我不键入@model,

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

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

我习惯了“强类型”的意思是“不会编译”,比如linqtowhates,如果属性不正确,就不会编译。除了IntelliSense和运行时错误之外,
@model
还有其他用途吗?如果它实际上不是,为什么称它为强类型


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


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

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

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

<MvcBuildViews>true</MvcBuildViews>
true
这种方法的缺点是构建时间将显著增加。您应该考虑仅为发布版本设置此选项为true。


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

的可能重复项,尽管我的问题肯定不是您所说的问题的重复项,但实际答案可能有用。Eranga实际上已经指出了您所问问题的可能答案。据我所知,您需要对Razor视图进行编译时验证。该链接显示了如何设置它。@Eranga,是的,这是我在第一条评论中说的,问题的答案可以适用。:)似乎如果我的视图有
@model IEnumerable
,并且我在控制器中使用
返回视图(“TheView”,new int[]{1,2,3})
调用此视图,那么即使在.csproj文件中
MvcBuildViews
为“true”,项目编译也不会出错。