Sparkビューエンジンでasp.net mvc 2機能を使用する
-
05-07-2019 - |
質問
元々 CodeBetter.Canvas プロジェクト-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)を使用して、恐らくそれは恐ろしいものの1つであると考えています-しかし、これまでのところ運はありません-私はまだ同じ振る舞いを見ています。
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);
また、前述のように、スパークビューでSystem.Web.Mvc.Htmlを参照しています別のSO回答で。
<use namespace="System.Web.Mvc.Html" />
解決
根本的な問題は、バージョン1.0.0アセンブリがプロジェクトのどこかでまだ参照されていることです。
リフレクターを使用して各アセンブリの依存関係を調べたところ、再びCodeBetter.Canvasプロジェクトから開始)2.0.0バージョンのsystem.web.mvc.dllを使用するために更新する必要がある 3つの依存プロジェクトがあります
-
Spark 。最新バージョンをダウンロードする チームシティからの火花の spark.web.mvc2.dll(参照する system.web.mvc.dll 2.0.0)詳細な手順へのリンク。
-
MVCContrib 。最新バージョンをダウンロードする MVCContrib(リリースをダウンロード、< href = "http://github.com/mvccontrib/MvcContrib" rel = "nofollow noreferrer">ソースをダウンロード) system.web.mvc.dll 2.0.0。
-
Ninject 。 最新バージョンをダウンロード ninject とVSソリューションの再コンパイル 2.0.0への参照を更新した後 system.web.mvc.dllのバージョン
次に、プロジェクト内のこれらの依存関係のアセンブリを置き換え、必要に応じてプロジェクト参照を更新します。すべてうまくいくはずです。
他のヒント
最近、sparkプロジェクトをasp.net mvc 2に変換しました。Spark.Web.MvcからSpark.Web.Mvc2に切り替えたことを、あなたが書いたことには見当たりません。
明確にするために、Spark.Web.Mvc2は、新しいSystem.Web.Mvcアセンブリで再コンパイルする必要があるプロジェクトです。
すべてのアセンブリと名前空間の参照をweb.configから削除してglobal.sparkファイルに追加し、pageBaseType =&quot; Spark.Web.Mvc2.SparkView&quot;を追加するまで、intellisenseに問題がありました。 web.configのSpark-&gt; Pagesノードの属性。
そのいずれかが役立つことを願っています。
最新のSparkソースをダウンロードしたとき、MVC 2アセンブリを使用して再構築しましたか? Sparkプロジェクトの参照を置き換えましたか?
特定のバージョンを指定できるように、Global.ascx.csファイルではなくweb.configで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
これがお役に立てば幸いです
ジェフ・フレンチ
これらは、新しいMVC 2プロジェクトとSpark 1.1で問題を解決するために行った手順です。
-
MVC 2.0に対してコンパイル-MVC 1ではなくMVC 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でも実行できます。
-
型付きモデルを追加-Sparkビューモデルを入力したことを確認します。 aspxでは、次のように、ページ宣言の継承を使用してこれを行います。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyModelType>" %>
Sparkで:
<viewdata model="MyModelType" />
上記の多くのことを試してみましたが、MVC 2.0.0.0を使用するために私のビューが使用した(そしてMVC 1.0.0.0も参照した)依存DLLを取得できなかったため、ここで修正しました。 ..
Sparkコードをダウンロードし、CompileメソッドのBatchCompiler.csファイルに次の行を追加しました。
compilerParameters.CompilerOptions = "/nowarn:1701";