我正在使用最初从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" />
答案 0 :(得分:9)
根本问题是版本1.0.0程序集仍在项目中的某处引用。
使用reflector检查每个程序集依赖项,我发现(如果您从CodeBetter.Canvas项目开始),有三个依赖项目需要更新才能使用2.0 .0版本的system.web.mvc.dll
<强>火花即可。下载最新版本 来自teamcity的火花并使用 spark.web.mvc2.dll(引用 system.web.mvc.dll 2.0.0)Link to detailed instructions.
<强> MVCContrib 即可。下载最新版本 MVCContrib(download release,download source)引用的 system.web.mvc.dll 2.0.0。
<强> Ninject 即可。 Download the latest version of ninject并重新编译VS解决方案 更新对2.0.0的引用后 system.web.mvc.dll
现在,在项目中替换这些依赖项的程序集,并在必要时更新项目引用。一切都应该好。
答案 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解决问题的步骤:
编译MVC 2.0 - 我仔细检查了引用,以确保我链接到MVC 2而不是MVC 1.由于这是一个新项目,这不是问题。
添加了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中完成。
添加类型化模型 - 确保键入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";