使用带有spark视图引擎的asp.net mvc 2功能

时间:2009-11-26 21:38:03

标签: asp.net-mvc spark-view-engine

我正在使用最初从CodeBetter.Canvas项目启动的ASP.NET MVC项目 - 我正在尝试迁移到ASP.NET MVC 2.我使用{{3}成功升级了我的项目},转移到VS2010(虽然还没有到.NET 4)。

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

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

如果我使用.aspx视图,那么相同的代码可以正常工作

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

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

我已经尝试Eilon's upgrade tool(以及MvcContrib和Ninject),想想也许这是其中一个吓坏了 - 但到目前为止没有运气 - 我仍然看到相同的行为。

以下是Spark的BatchCompiler类中抛出的完整错误消息。

  

动态视图编译失败。   (0,0):警告CS1701:假设   程序集引用'System.Web.Mvc,   版本= 1.0.0.0,文化=中立,   公钥= 31bf3856ad364e35'   匹配'System.Web.Mvc,   版本= 2.0.0.0,文化=中立,   PublicKeyToken = 31bf3856ad364e35',你   可能需要提供运行时策略   C:\的Inetpub \ wwwroot的[myproject的] \ CodeBetter.Canvas.Web \浏览[myEntity所] \ View.spark(9,16):   错误CS1061:   'System.Web.Mvc.HtmlHelper'没有   包含'EditorFor'的定义   没有扩展方法'EditorFor'   接受第一个类型的参数   'System.Web.Mvc.HtmlHelper'可以   发现(你错过了使用   指令或程序集引用?)

以下是我的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);

另外,我在我的火花视图中引用了System.Web.Mvc.Html,如upgrading Spark to use MVC 2所述。

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

6 个答案:

答案 0 :(得分:9)

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

使用reflector检查每个程序集依赖项,我发现(如果您从CodeBetter.Canvas项目开始),有三个依赖项目需要更新才能使用2.0 .0版本的system.web.mvc.dll

  1. <强>火花即可。下载最新版本 来自teamcity的火花并使用 spark.web.mvc2.dll(引用 system.web.mvc.dll 2.0.0)Link to detailed instructions.

  2. <强> MVCContrib 即可。下载最新版本 MVCContrib(download releasedownload source)引用的 system.web.mvc.dll 2.0.0。

  3. <强> Ninject 即可。 Download the latest version of ninject并重新编译VS解决方案 更新对2.0.0的引用后 system.web.mvc.dll

  4. 的版本

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

答案 1 :(得分:2)

我最近将我的spark项目转换为asp.net mvc 2.我没看到你写的是你已经从使用Spark.Web.Mvc切换到Spark.Web.Mvc2。

为了清楚起见,Spark.Web.Mvc2是需要使用新的System.Web.Mvc程序集重新编译的项目。

我遇到了intellisense的问题,直到我从web.config中删除了所有的程序集和命名空间引用并将它们放在global.spark文件中,并将pageBaseType =“Spark.Web.Mvc2.SparkView”属性添加到了Spark- &gt; web.config中的Pages节点。

希望任何有用的东西。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

<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

希望这有帮助,

杰夫法语

答案 4 :(得分: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 View模型。在aspx中,这是通过页面声明中的Inherits完成的,如下所示:

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

    <viewdata model="MyModelType" />
    

答案 5 :(得分:0)

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

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

compilerParameters.CompilerOptions = "/nowarn:1701";