5

site1/v1/views/index.cshtml私は現在、同じコントローラーを使用する複数の場所で同様のビューを管理する責任がある.netmvc3アプリケーションを持っていますsite1/v2/views/index.cshtml

これを処理する方法は、DefaultControllerFactoryを継承するCustomControllerFactoryを作成し、CreateControllerメソッドで、既存のビューエンジンをクリアし、現在のURLに基​​づいてビューの場所の形式を指定する新しいカスタムviewEngineを追加することです。

ユーザーがに到達した場合site1.com/v1/index.cshtml、viewengineは次のビューの場所を指定します。

string versionDirectory = "v1";
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml",
                             "/Views/{0}.cshtml",
                             "~/Shared/{0}.cshtml"
                            };

私が抱えている問題は、複数のユーザーがほぼ同時に異なるページにアクセスすると、すべてのユーザーに同じビューが表示されることです。

当初、これはキャッシングに関連していると思いましたがusecache = false、カスタムviewEngineで明示的に設定した後、これはViewEnginesクラスがスレッドセーフではないことに関係しているようです。

同じ結果を別の方法で達成する方法について誰かが何か考えを持っていますか?

前もって感謝します。

4

2 に答える 2

9

ViewEnginesコレクションは静的コレクションであるため、その値はリクエスト間で共有されます。あなたがしようとしていることは可能ですが、あなたがそれをしている方法は正しくありません。

簡単なアプローチの1つは、RazorViewEngineから派生し、FindViewメソッドをオーバーライドするカスタムビューエンジンを作成することです。そのメソッドは、リクエストごとに1回呼び出されます。実装では、base.FindViewを呼び出してから、結果を変更して(nullでない場合)、必要なサイト情報を含めます。

Scott Hanselmanのブログ投稿には、カスタムビューエンジンを介して別の場所でビューを探す例が示されています。http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

于 2011-02-19T04:56:41.450 に答える
1

組み込みのビューエンジンはスレッドセーフです。問題は、キャッシュまたはカスタムビューエンジンです。他の回答のリンクにあるキャッシュコメントを確認してください。

于 2011-02-19T06:25:14.870 に答える