问题
ASP.NET MVC 3 RC在运行时(浏览时)向外部MVC区域发出编译错误.网站本身有效,但插件拒绝加载抛出与未知模型有关的编译问题.
LogOn.cshtml
@model TestProject.Models.LogOnModel @{ View.Title = "Log On"; } //.....omitted for brevity
运行时抛出错误.
Compilation Error Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. Compiler Error Message: CS0103: The name 'model' does not exist in the current context Source Error: Line 38: public override void Execute() { Line 39: Line 40: Write(model); Line 41: Line 42: WriteLiteral(" TestPlugin.Models.LogOnModel\r\n");
背景
该网站是我刚刚迁移到ASP.NET MVC 3 RC的ASP.NET MVC 3 Preview 1网站.我阅读了发行说明并进行了相应更新,但仍然遇到了WebMatrix的问题.我找到了一个SO问题,来自MVC团队的人建议,直到RTM,我们使用以下命令强制命名空间被引入(我把它们放在web.config中但它不起作用).
namespace WebMatrix.Data { class Foo { } } namespace WebMatrix.WebData { class Foo { } }
这解决了我在网站内的问题,网站现在在MVC 3 RC中正常加载.然而,问题是外部MVC区域(单独的组装).
注意我没有使用任何第三方库,我写了一个小插件框架,允许从另一个程序集加载MVC区域.视图被编译为嵌入式资源.
所以我有一个身份验证插件,例如看起来像.
-Controllers -- AccountController.cs -Models -- AccountModels.cs -Views --Account --- LogOn.cshtml --- ChangePassword.cshtml --- ... -Web.config AccountAreaRegistration.cs Web.config
除了将视图标记为嵌入资源这一事实之外,AccountController还扩展了一个知道如何加载嵌入式资源和删除了global.asax的PluginController,它是一个非常标准的MVC区域.
我尝试创建一个新的空MVC 3测试插件项目,然后慢慢添加相关代码.这可以确保所有引用和web.configs都正确.但我仍然收到上述相同的型号问题.该项目在设计时编译,但在尝试发出它看起来的视图时会在运行时抛出一个编译问题.
为了清楚起见,这一切在ASP.NET MVC 3 Preview 1中运行良好.但是,现在我已将其升级到MVC 3 RC我的核心网站正在运行,但外部区域拒绝工作.
插件框架本身没有任何问题.它在MVC 3 Preview 1中运行良好.我正在寻找可能对MVC 3 RC中可能出现的内容有所了解的答案,以及为什么我可能会使用接收此模型错误.
有任何想法吗?
更新
有趣的是,如果我将视图顶部的模型声明更改为预览1语法`@inherits System.Web.Mvc.WebViewPage
我得到一个不同的运行时编译错误.这次我在登录表单的Html.ValidationSummary开始时进一步向下发生错误.
@inherits System.Web.Mvc.WebViewPage@{ View.Title = "Log On"; } VastID Login
@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") // <=== Compilation issue here on Html.ValidationSummary @using (Html.BeginForm()) { // .. omitted for brevity }
Compilation Error Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. Compiler Error Message: CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'ValidationSummary' and no extension method 'ValidationSummary' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?) Source Error: Line 49: Line 50: Line 51: Write(Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")); Line 52: Line 53: WriteLiteral("\r\n");
有趣的是没有编译时错误.System.Web.WebPages,System.Web.Helpers和所有必需的MVC 3 RC dll都存在.包括必要的web.config.就好像这些在尝试加载视图时不可用.
我相信实际的剃刀语法是System.Web.WebPages的一部分?Html.ValidationSummary在哪里?System.Web.Mvc或System.Web.Helpers?
我实际上发现我的/ Plugins文件夹中缺少ASP.NET MVC 3 RC web.config.这是一个空文件夹,而不是必须为插件虚拟路径提供程序提供的web.config.这是缺失的环节.
基本上会发生的是你有一个扩展的控制器PluginController
.这个控制器改变了视图的路径,并附加了"插件"和程序集名称(记住我们在这里处理嵌入式视图).所以你最终得到类似的东西
/Plugins/TestProject.dll/TestProject.Views.Account.LogOn.cshtml
然后,虚拟路径提供程序和集合类负责从插件资源清单中查找并返回此视图.
让我真正难过的是预览1和Beta之间的重大变化,他们添加了一个_ViewStart.cshtml.当从插件请求诸如Logon.cshtml之类的视图时,框架的内部请求正在为该组件中不存在的_ViewStart文件进行.由于此时执行已经在虚拟路径提供程序中,我无法从网站返回_ViewStart.cshtml.所以我在插件中添加了一个.
我不得不对PluginVirtualFile.cs和PluginProvider.cs进行更改.所以我最终完成了所有工作.
非常感谢@Eilon的帮助.虽然它没有得到答案,但非常感谢.
看起来你的CSHTML文件正在被编译,好像没有@model
关键字,并且它实际上认为你想要渲染一个名为的变量model
.
如果您的CSHTML文件位于Views
包含特殊web.config且具有MVC特定Razor设置的文件夹下,那么它应该知道这@model
是一个关键字而不是正在呈现的变量.请检查您的~/Views/web.config
文件,确保它具有
MVC Razor主机的部分和正确的设置.