【发布时间】:2011-05-08 19:50:48
【问题描述】:
问题
ASP.NET MVC 3 RC 在运行时(浏览时)给我一个外部 MVC 区域的编译错误。该网站本身可以运行,但该插件拒绝加载引发与未知模型有关的编译问题。
LogOn.cshtml
@model TestProject.Models.LogOnModel
@{
View.Title = "Log On";
}
//.....omitted for brevity
运行时抛出错误。
编译错误 说明:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。 编译器错误消息:CS0103:当前上下文中不存在名称“模型” 源错误: 第 38 行:公共覆盖 void Execute() { 第 39 行: 第 40 行:写入(模型); 第 41 行: 第 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 中可能发生的事情以及为什么我可能会使用接收此模型错误有所了解的答案。
有什么想法吗?
更新
有趣的是,如果我将视图顶部的模型声明更改为 Preview 1 语法`@inherits System.Web.Mvc.WebViewPage
我得到一个不同的运行时编译器错误。这一次,当登录表单的 Html.ValidationSummary 开始时,我得到一个错误。
@inherits System.Web.Mvc.WebViewPage<TestProject.Models.LogOnModel>
@{
View.Title = "Log On";
}
<div class="content_item half loginform">
<div class="content_body">
<h1>VastID Login</h1>
@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
}
</div>
</div>
编译错误
说明:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。
编译器错误消息:CS1061:“System.Web.Mvc.HtmlHelper”不包含“ValidationSummary”的定义,并且找不到接受“System.Web.Mvc.HtmlHelper”类型的第一个参数的扩展方法“ValidationSummary”(您是否缺少 using 指令或程序集引用?)
源错误:
第 49 行:
第 50 行:
第 51 行:Write(Html.ValidationSummary(true, "登录失败。请更正错误并重试。"));
第 52 行:
第 53 行:WriteLiteral("\r\n");
有趣的是没有编译时错误。 System.Web.WebPages、System.Web.Helpers 和所有必要的 MVC 3 RC dll 都存在。包括必要的 web.config。然而,当试图加载视图时,就好像这些不可用。
我认为实际的 razor 语法是 System.Web.WebPages 的一部分? Html.ValidationSummary 在哪里? System.Web.Mvc 还是 System.Web.Helpers?
【问题讨论】:
-
插件/区域源代码是什么样的?看起来它引用了一个不存在的名为“model”的变量。
-
这是剃刀视图的开始,将视图模型强类型化为登录模型。我将更新问题以澄清这一点。
-
你用什么来编译CSHTML文件?
-
我不确定我是否理解这个问题?
-
看起来你的 CSHTML 文件正在被编译,好像没有“@model”关键字,并且它实际上认为你想要呈现一个名为“model”的变量 - 与我所说的相反在我下面的实际答案中。如果您的 CSHTML 文件位于“Views”文件夹下,其中包含具有特定于 MVC 的 Razor 设置的特殊 web.config,那么它应该知道“@model”是关键字而不是正在呈现的变量。
标签: c# asp.net-mvc asp.net-mvc-3