【问题标题】:External ASP.NET MVC 3 area not compiling at runtime (works in Preview 1 but not RC)外部 ASP.NET MVC 3 区域在运行时未编译(适用于 Preview 1 但不适用于 RC)
【发布时间】: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


【解决方案1】:

我实际上发现我的 /Plugins 文件夹中缺少 ASP.NET MVC 3 RC web.config。这是一个除 web.config 之外的空文件夹,插件虚拟路径提供程序必须存在。这是缺少的链接。

基本上发生的情况是您有一个扩展PluginController 的控制器。此控制器更改视图的路径并附加“插件”和程序集名称(请记住,我们在这里处理嵌入式视图)。所以你最终会得到类似的东西

/Plugins/TestProject.dll/TestProject.Views.Account.LogOn.cshtml

然后,虚拟路径提供程序和集合类负责从插件资源清单中查找并返回此视图。

真正让我难过的是预览版 1 和测试版之间的重大变化,他们添加了 _ViewStart.cshtml。当从插件请求诸如 Logon.cshtml 之类的视图时,框架正在为该程序集中不存在的 _ViewStart 文件发出内部请求。由于当时已经在虚拟路径提供程序中执行,因此我无法找到从网站返回 _ViewStart.cshtml。所以我在插件中添加了一个。

我不得不同时修改 PluginVirtualFile.cs 和 PluginProvider.cs。所以我最终完成了所有工作。

非常感谢@Eilon 的帮助。虽然它没有得到答案,但非常感谢。

【讨论】:

  • 感谢发帖。升级时我在 mvc 便携式区域遇到了同样的问题。
  • 如果你能更详细地解释你是如何解决这个问题的,那将是一个很大的帮助。我有同样的问题。我将 _ViewStart.cshtml 添加到了我的外部插件项目中,我得到了新的错误,这取决于我在 ViewStart 文件中输入的内容。我遇到的第一个错误是它无法将我的 _ViewStart.cshtml 转换为“System.Web.WebPages.StartPage”类型。任何帮助将不胜感激!谢谢!
  • 类似于@JoshuaHayes 我必须创建一个包含 web.config 和 _ViewStart.cshtml 的空插件文件夹。然后我修改了我的“嵌入式”虚拟路径提供程序以忽略任何包含 _ViewStart 的路径。
【解决方案2】:

看起来你的 CSHTML 文件正在被编译,好像没有 @model 关键字,并且它实际上认为你想要呈现一个名为 model 的变量。

如果您的 CSHTML 文件位于 Views 文件夹下,其中包含具有 MVC 特定 Razor 设置的特殊 web.config,那么它应该知道 @model 是关键字而不是正在呈现的变量。请检查您的 ~/Views/web.config 文件并确保它具有 &lt;system.razor.web&gt; 部分和 MVC Razor 主机的正确设置。

【讨论】:

  • 是的 ~/Views/web.config 是从干净的 MVC 3 RC Views 文件夹的 views 文件夹中复制的。它有适当的&lt;system.razor.web&gt; 部分。我发现没有这个项目实际上不会正确编译,我会在编译/设计时遇到这些问题。
  • 您现在似乎列出了一个新错误。您是否检查过 web.config 部分是否还包含默认的 MVC 命名空间,例如 System.Web.Mvc.Html
  • 是的,因为它是一个完全标准的 ~/Views/web.config 它拥有所有这些。和更多; System.Web.Mvc, System.Web.Mvc.Ajax, System.Web.Mvc.Html, System.Web.Routing etc.
  • 我将视图顶部的 @model 声明恢复为 Preview 1 语法(因为这似乎仍然受支持?)只是为了看看我是否可以通过它/继续使用不同的语法错误。我做到了。就好像asp在运行时找不到dll一样。
【解决方案3】:

我有这个 .. 它是 我没有在路由或 Views 文件夹中部署我的 web.config

(我使用 Beyond Compare 进行部署,但我的 web.config 被过滤掉了,因此它被遗漏了)

【讨论】:

  • 如果您能详细说明这一点,那就太好了,因为对于已经详细解释了他的问题的人,欢迎更清晰地回答,因为将来可能会出现类似情况并且可能需要更多了解您的解决方案的上下文:)
  • Views 文件夹中缺少 Web.config,导致我出现此错误。
【解决方案4】:

在我的情况下缺少这个: 在 configSections 中有 system.web.webPages.razon,但错过了相关部分。

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2014-11-15
    • 2020-09-01
    • 2013-10-01
    • 2017-01-12
    • 2020-05-10
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多