26

Asp.Net MVC4 でビルドされたプロトタイプ アプリケーションを受け取りました。現在、NInject、ServiceLocator などを使用して、デフォルトのコントローラ ファクトリをカスタム ファクトリに置き換えています。

問題は、デフォルトのコントローラ ファクトリを置き換えることによって、JS ファイルへのリクエストが、コントローラとアクションに対する正当なリクエストであるかのように扱われることです。

したがって、Visual Studio によって作成された既定のテンプレートを見ると、ルート構成は次のようになります。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id =   UrlParameter.Optional }
    );
}

それを見た後、私は自問しています:「/Scripts/jquery.js」へのリクエストがAsp.Net MVCによって解釈されないのはなぜですか? つまり、「スクリプト」がコントローラーで、「jquery.js」がアクションであると見なされないのはなぜですか?

コントローラ ファクトリ オーバーライドを無効にするとプロジェクトが機能するため、デフォルト ファクトリがその種のチェックを担当しているとしか思えません。そして、それは「/Scripts/jquery.js」が実際にコントローラーファクトリーに渡されることを意味しますが、これは私が本当に知りませんでした。

誰かがそれに光を当てることができますか?

このような問題を回避するためにコントローラ ファクトリをオーバーライドする場合、どのような処理を行う必要がありますか?

4

3 に答える 3

32

これは、MVC が jquery.js への要求を処理する方法が原因ではなく、IIS が jquery.js への要求を処理する方法が原因です。IIS は、.js、.jpg などのリソースはすべて静的リソースであると想定しているため、ASP.NET エンジンを介してそれらを渡す必要はありません。これが発生しないようにするために、IIS に残しておきたいパスの行を web.config に追加できます。

<system.webserver>
    <handlers>
    <add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
</system.webserver>

そのようなものを追加すると、IIS を介して直接ではなく、ASP.NET を介して JS ファイルを提供できるようになります。

于 2013-06-05T20:22:12.557 に答える
20

もう少し調査した後、スティーブン・サンダーソンの本から次の引用を見つけました。

ただし、ルーティング システムは引き続きファイル システムをチェックして、着信 URL がたまたまファイルまたはディスクに一致するかどうかを確認します。一致する場合、ルーティングは要求を無視し (URL も一致する可能性のあるルート エントリをバイパスします)、ファイルが直接提供されます。これは、画像、CSS、JavaScript ファイルなどの静的ファイルに非常に便利です。それらをプロジェクト (たとえば、/Content または /Script フォルダー) に保持し、ルーティングをまったく使用していないかのように、それらを直接参照して提供することができます。ファイルは実際にディスク上に存在するため、ルーティング構成よりも優先されます。

代わりに、ルーティング構成をディスク上のファイルよりも優先したい場合は、RouteCollection の RouteExistingFiles プロパティを true に設定できます。(デフォルトでは false です。)

それは学ぶのに非常に興味深いものであり、実際の問題に私を導きました。はるかに単純なもの。たまたま、関連するスクリプトがフォルダーに存在しませんでした。少なくとも、ビューで要求されたバージョンとまったく同じものではありません。それは、Asp.Net MVC がコントローラー/アクション リクエストであると考える責任がありました。

参照: http://forums.asp.net/t/1536510.aspx/1

于 2013-06-05T20:37:29.357 に答える