代码之家  ›  专栏  ›  技术社区  ›  Ian Robinson

在Spark View引擎中使用ASP.NET MVC 2功能

  •  9
  • Ian Robinson  · 技术社区  · 15 年前

    我正在处理一个ASP.NET MVC项目,该项目最初是从 CodeBetter.Canvas 项目-我正在尝试转到ASP.NET MVC 2。我成功地用升级了我的项目 Eilon's upgrade tool ,移动到VS2010(尽管尚未移动到.NET 4)。

    我现在遇到的问题只有在使用Spark View引擎时才会发生。以下是我的视图中的相关代码位。spark(强类型):

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

    相同的代码位 工作很好 如果我使用.aspx视图:

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

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

    我试过了 upgrading Spark to use MVC 2 (和mvcontrib和ninject一样),我想也许是其中一个让人感到害怕的人——但到目前为止还没有运气——我仍然看到同样的行为。

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

    动态视图编译失败。 (0,0):警告CS1701:假设 程序集引用“system.web.mvc, 版本=1.0.0.0,文化=中性, publicKeyToken=31BF3856AD364E35' 与“system.web.mvc”匹配, 版本=2.0.0.0,文化=中性, publickeytoken=31bf3856ad364e35',您 可能需要提供运行时策略 C:\inetpub\wwwroot[myproject]\codebetter.canvas.web\views[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);
    

    另外,我在Spark视图中引用system.web.mvc.html,如前所述。 in another SO answer .

    <use namespace="System.Web.Mvc.Html" />
    
    6 回复  |  直到 13 年前
        1
  •  9
  •   Community CDub    8 年前

    基础问题是1.0.0版程序集仍在项目的某个地方被引用。

    使用 reflector 为了检查每个程序集依赖项,我发现(如果您从codebetter.canvas项目开始)有 需要更新才能使用System.Web.MVC.dll的2.0.0版本的依赖项目

    1. 火花 . 下载最新版本 来自TeamCity的火花并使用 spark.web.mvc2.dll(参考 system.web.mvc.dll 2.0.0) Link to detailed instructions.

    2. MVC中心 . 下载最新版本 关于MVCCONTIB(MVCTO) download release ,请 download source )它引用了 system.web.mvc.dll 2.0.0。

    3. 九针 . Download the latest version of ninject 并重新编译vs解决方案 更新对2.0.0的引用之后 system.web.mvc.dll版本

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

        2
  •  2
  •   midas06    15 年前

    我最近将Spark项目转换为ASP.NET MVC 2。我看不出你写的东西,你已经从使用spark.web.mvc转向使用spark.web.mvc2了。

    为了清楚起见,spark.web.mvc2是需要用新的system.web.mvc程序集重新编译的项目。

    在从web.config中删除所有程序集和命名空间引用并将它们放入global.spark文件中之前,我对intellisense有一些问题,并将pagebasetype=“spark.web.mvc2.sparkview”属性添加到web.config中的spark->pages节点。

    希望有任何帮助。

        3
  •  1
  •   LukLed    15 年前

    下载最新的火花源时,是否使用MVC 2程序集重新生成了它?你替换了Spark项目中的参考资料了吗?

        4
  •  1
  •   Jeff French    15 年前

    尝试在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
    

    希望这有帮助,

    杰夫法语

        5
  •  1
  •   Samg    14 年前

    以下是我为解决新MVC 2项目和Spark 1.1中的问题所采取的步骤:

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

    2. 添加了system.web.mvc.html -我在spark配置中添加了system.web.mvc.html,以确保将名称空间添加到所有视图中。

      在global.asax.cs应用程序中启动

       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引擎块的webconfig中完成。

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

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

      星火:

      <viewdata model="MyModelType" />
      
        6
  •  0
  •   Jason Haley    14 年前

    我尝试了很多上面提到的事情,但是不能得到一个依赖的dll,我的视图使用(也引用了MVC 1.0.0.0)来使用MVC 2.0.0.0,所以这里是我修复它的原因…

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

    compilerParameters.CompilerOptions = "/nowarn:1701";