9

我正在使用最初从CodeBetter.Canvas项目开始的 ASP.NET MVC 项目 - 我正在尝试迁移到 ASP.NET MVC 2。我使用Eilon 的升级工具成功升级了我的项目,迁移到 VS2010(虽然尚未到 .NET 4)。

我目前遇到的问题仅在使用火花视图引擎时发生。这是我的 View.spark 中的相关代码(强类型):

${Html.EditorFor(e => e)}

如果我使用 .aspx 视图,同样的代码也可以正常工作:

<%= Html.EditorFor(e => e) %>

这里的重点是“EditorFor”是 ASP.NET MVC 2 中的新功能,在我的项目中,我可以在 ASPX 视图中使用该助手,但不能在 Spark 视图中使用。

我已经尝试升级 Spark 以使用 MVC 2(以及 MvcContrib 和 Ninject),我认为它可能是其中一个吓坏了 - 但到目前为止还没有运气 - 我仍然看到相同的行为。

这是从 Spark 的 BatchCompiler 类中抛出的完整错误消息。

动态视图编译失败。(0,0): 警告 CS1701: 假设程序集引用 'System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 匹配 'System.Web.Mvc, Version=2.0.0.0, Culture=neutral , PublicKeyToken=31bf3856ad364e35',您可能需要提供运行时策略 c:\inetpub\wwwroot[myproject]\CodeBetter.Canvas.Web\Views[MyEntity]\View.spark(9,16): error CS1061: 'System.Web .Mvc.HtmlHelper' 不包含'EditorFor' 的定义,并且找不到接受'System.Web.Mvc.HtmlHelper' 类型的第一个参数的扩展方法'EditorFor'(您是否缺少 using 指令或程序集引用?)

这是我的 Global.asax 中的 Spark 相关代码:

var settings = new SparkSettings()
.AddNamespace("System")
.AddNamespace("System.Collections.Generic")
.AddNamespace("System.Web.Mvc")
.AddNamespace("System.Web.Mvc.Html")
.AddNamespace("MvcContrib.FluentHtml")
.AddNamespace("CodeBetter.Canvas")
.AddNamespace("CodeBetter.Canvas.Web")
.SetPageBaseType("ApplicationViewPage")
.SetAutomaticEncoding(true);

#if DEBUG
    settings.SetDebug(true);
#endif

var viewFactory = new SparkViewFactory(settings);
ViewEngines.Engines.Add(viewFactory);

此外,我在我的 spark 视图中引用 System.Web.Mvc.Html,如另一个 SO answer中所述。

<use namespace="System.Web.Mvc.Html" />
4

6 回答 6

9

根本问题是项目中的某处仍在引用版本 1.0.0 程序集。

使用反射器检查每个程序集依赖项,我发现(如果您从 CodeBetter.Canvas 项目开始)需要更新三个依赖项目以使用 2.0.0 版本的 system.web.mvc.dll

  1. 火花。从 teamcity 下载最新版本的 spark 并使用 spark.web.mvc2.dll(引用 system.web.mvc.dll 2.0.0)链接到详细说明。

  2. MVContrib。下载引用system.web.mvc.dll 2.0.0的最新版MVCContrib(下载发布下载源)。

  3. 忍者下载最新版ninject,更新参考2.0.0版system.web.mvc.dll后重新编译VS解决方案

现在,在您的项目中替换这些依赖项的程序集,并在必要时更新项目引用。一切都应该很好。

于 2009-12-05T22:10:08.773 回答
2

我最近将我的 spark 项目转换为 asp.net mvc 2。在您所写的内容中,我没有看到您已从使用 Spark.Web.Mvc 切换到 Spark.Web.Mvc2。

需要明确的是,Spark.Web.Mvc2 是需要使用新的 System.Web.Mvc 程序集重新编译的项目。

在我从 web.config 中删除所有程序集和命名空间引用并将它们放入 global.spark 文件并将 pageBaseType="Spark.Web.Mvc2.SparkView" 属性添加到 Spark->Pages 节点之前,我遇到了智能感知问题在 web.config 中。

希望任何帮助。

于 2009-12-02T18:21:06.463 回答
1

当您下载最新的 Spark 源代码时,您是否使用 MVC 2 程序集重新构建它?您是否替换了 Spark 项目中的引用?

于 2009-11-28T19:27:45.483 回答
1

尝试在 web.config 而不是 Global.ascx.cs 文件中指定 System.Web.Mvc 引用,以便您可以指定特定版本:

<spark>
  <compilation debug="true" defaultLanguage="CSharp">
     <assemblies>
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
     </assemblies>
 </compilation>
</spark>

如果从某个地方加载了错误版本的 MVC 程序集,这应该会阻止 SPARK 工作。

如果 MVC 1.0 程序集在 GAC 中,您可以按如下方式清除并重新加载它:

(来自 Visual Studio 命令提示符)

ngen /delete System.Web.Mvc
ngen /delete System.Web.Abstractions
ngen update

希望这可以帮助,

杰夫法兰西

于 2009-12-01T18:52:37.843 回答
1

这些是我为解决新 MVC 2 项目和 Spark 1.1 问题而采取的步骤:

  1. 针对 MVC 2.0 进行编译- 我仔细检查了引用以确保我链接到 MVC 2 而不是 MVC 1。因为这是一个新项目,所以这不是问题。

  2. 添加 System.Web.Mvc.Html - 我将 System.Web.Mvc.Html 添加到 Spark 配置中,以确保将命名空间添加到所有视图。

    在 Global.asax.cs Application_Start

     var settings = new SparkSettings()
         .SetDebug(true)
         .SetAutomaticEncoding(true)
         .AddAssembly("Web")
         .AddNamespace("Web.Model")
         .AddNamespace("System.Collections.Generic")
         .AddNamespace("System.Linq")
         .AddNamespace("System.Web.Mvc")
         .AddNamespace("System.Web.Mvc.Html");
    

    这也可以在 Spark View Engine 块的 webconfig 中完成。

  3. 添加类型化模型- 确保键入 Spark 视图模型。在 aspx 中,这是通过页面声明中的继承来完成的,如下所示:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<MyModelType>" %>
    

    在火花:

    <viewdata model="MyModelType" />
    
于 2010-12-06T18:40:20.990 回答
0

我尝试了上面提到的很多东西,但无法获得我的视图使用的依赖 dll(并且还引用了 MVC 1.0.0.0)来使用 MVC 2.0.0.0,所以这就是为我修复它的方法......

我下载了 Spark 代码,并在 Compile 方法中的 BatchCompiler.cs 文件中添加了以下行:

compilerParameters.CompilerOptions = "/nowarn:1701";
于 2010-09-23T18:11:17.543 回答