ビュー エンジンを登録する順序は (あまり) 重要ではありません。むしろ、ビュー エンジンは のセットを取り、ViewLocationFormats
特定のビュー パスがフォーマットされた名前に適合する場合、そのエンジンが使用されます。競合する形式がある場合にのみ、登録順序が重要になります。
スパークの場合、ビューには.spark
拡張子が必要です。 または拡張子WebFormViewEngine
の付いたものに応答します。そしてもちろん、前述のように、個々のビュー エンジンに提供されている を変更することで、これをオーバーライドできます。.aspx
.ascx
ViewLocationFormats
更新しました:
SparkViewFactory
とWebFormViewEngine
(より具体的には、後者の派生元) の両方のソースを調べたところ、VirtualPathProviderViewEngine
この奇妙な動作が見られる理由がわかります。
まずFind
、クラスのメソッドは次のViewEngineCollection
ように機能します (簡略化)。
foreach (IViewEngine engine in Items) {
// Query engine for cached view
}
foreach (IViewEngine engine in Items) {
// Query engine for uncached view
}
つまり、キャッシュされていないモードに頼る前に、どのエンジンでも常にキャッシュされたビューを見つけようとします。
個々のビュー エンジンがこれを実装する方法は、メソッドの 2 番目のオーバーロードであり、という名前の引数FindView
を取ります。bool
useCache
ただし、ここですべてが奇妙にVirtualPathProviderViewEngine
なります。 と は、引数SparkViewEngine
が何を意味するかについて非常に異なる考えを持っています。useCache
ここに再投稿するにはコードが多すぎますが、基本的な考え方は次のとおりです。
がの場合、はキャッシュのみSparkViewFactory
を検索します。何も見つからない場合は、自動的に「キャッシュ ミスの結果」が返されます。つまり、何も返されません。一方、isの場合、キャッシュをまったく検索せず、キャッシュ チェック ステップをスキップし、通常の動作を経て解決し、実際のビューを作成します。useCache
true
useCache
false
一方VirtualPathProviderViewEngine
、 は、 の場合useCache
はキャッシュtrue
を調べ、キャッシュにビューが見つからない場合はオフになり、新しいビューを作成してキャッシュに追加します。
これらのアプローチは両方とも、 がViewEngineCollection
検索を実行する方法に関して機能します。
したがって、ここで問題がどこにあるかを確認できるはずです。前者は最初の(キャッシュされた) 反復で常に成功しますが、Spark は2 番目VirtualPathProviderViewEngine
の (キャッシュされていない) 反復でのみ成功するため、のみがよりも優先されるようです。SparkViewEngine
平易な英語で言えば、Spark は実際に最初に質問されますが、 「いいえ、まだそのビューを持っていません。代わりにキャッシュなしで試してみてください」と答えます。WebForms は 2 番目に尋ねられますが、自動的に「そのビューはありませんでしたが、とにかくあなたのために作成しました。ここにあります」と答えます。. その時点から、WebFormViewEngine
キャッシュされたビューがあり、Spark がキャッシュされていないため、常に優先されます。
概要: SparkがuseCache
優先されていますが、Web フォーム エンジンが同時にアクティブになっていると、Spark の引数の処理方法に問題があるため、後回しになっています。あなたの視点に応じて、WebFormが過度に熱心であるか、Sparkが怠惰です。
簡単に言えば、解決策は意見が対立しないことです。 複数のビュー エンジンを登録した場合は、それらのいずれかまたは両方で処理できるビュー名を未定義の動作として扱う必要があります。