2012-07-03 13 views
5

を要求するときに、私は、レガシー・アプリケーションにいくつかの新しい人生を追加する必要があります:)起動ASP.NET MVCコントローラの.htmlファイル

ページをクライアントに返す前にページにマークアップを追加することをお勧めします。

私はこのスレッドで見つかったアプローチに従うことを試みた:How to read web.config settings in .html page?

...しかし、私はこのルートは定義されているにもかかわらず:

routes.MapRoute(
    name: "Topic", 
    url: "html/{fileName}.html", 
    defaults: new { controller = "Topic", action = "Index" }); 

コントローラが呼び出されていません。私はPageHandlerFactory以外の何かを呼び出す必要があるか、おそらく問題は全く違うものであることを疑う

<remove name="WebServiceHandlerFactory-Integrated" /> 
<add name="HTML" path="*.html" verb="*" 
    type="System.Web.UI.PageHandlerFactory" 
    resourceType="File" preCondition="integratedMode" /> 

:私は私のweb.configファイルは、と定義されています。

更新:私の開発環境は統合パイプラインモードで動作していますが、私の運用環境でサポートされているかどうかを確認する必要があります。

+3

IIS7 +統合パイプラインモードで実行していますか? –

答えて

6

あなたがこれを行う場合は、次の

routes.RouteExistingFiles = true; 

あなたがこの作品を見つける必要があります - でも、ハンドラを添加せず。コントローラではHostingEnvironment.VirtualPathProviderGetFileメソッドを使用して直接HTMLを読み込んで何かを行うことができます。または、単に静的ファイルと同じコンテンツをレンダリングする通常のMVCビューを使用するだけです。

これは、任意のルートによってキャッチされる可能性のあるファイルが、MVCパイプラインにプッシュされることを意味することに注意してください。ただし、経路と物理パスの適切な分離が使用されている場合、これは一般的に問題ではありません。

+0

質問に対する本当の答えは、AndrasとScottの提案の両方を行うことです。私は、ルート(Andrasごと)とweb.config設定(Scottごと)の有無にかかわらず、両方をテストしました。両方とも私がしようとしているもののために働かせる必要があります。みんなありがとう! –

+0

私はいくつかのIgnoreRoutesルールを追加して、サーバで処理する必要のない他の静的コンテンツまでアプリケーションを開きました。 –

+0

これはいい考えです:) –

3

私はあなたと同じ状況をセットアップしてくれました。それは私のためにうまくいきました。そのため、重要なコンポーネントが用意されています。テストとトラブルシューティングのために心に留めておくべきいくつかのもの:

あなたのweb.configファイルは、HTML拡張のためのビルドプロバイダーが必要行いますように、あなたのハンドラの

<system.web> 
    <compilation> 
     <buildProviders> 
     <add extension=".html" 
      type="System.Web.Compilation.PageBuildProvider" /> 
     </buildProviders> 
    </compilation> 
</system.web> 

コピー&ペーストは、私の作品いいね。

MapRouteのコピー&ペーストも私のために機能しますが、クリーンプロジェクトでデフォルトのホームコントローラを使用しました。だから、ダブルチェックでは、Index()というActionResultメソッドを持つTopicというコントローラがあることを確認するだけです。

あなたのルールが要求しているので、あなたのURLがパス内に/html/html/test.htmlであることを確認してください。

MapRouteを変更してaspxを代わりに使用し、aspxページをテストしてその動作を確認してください。これは、それがIISマッピングであるかどうか、またはそれがMVCルールであるかどうかを確認します。それがaspxで動作する場合、問題はハンドラに関連していますが、aspxでも失敗すると、MVCで問題になります。

また、CassiniではなくIIS Expressを使用していることを確認してください。カッシーニはそれを正しく処理しませんが、IIS Expressはこれを行います。プロジェクトを右クリックすると、「Visual Studio Development Studioを使用する...」というメニューオプションが表示されます。これは、現在IIS Expressを使用している場合にのみ存在します。

+0

リクエストがMVCコントローラにヒットするようにしたい場合は、これは役に立ちません。PageBuildProviderが使用されているときに意図されているため、リクエストはMVCに渡されるため、ページは直接実行されませんコントローラは、 '.html'拡張子を持つURLの代わりにビューをレンダリングすることになります。(ASPX、Razorなどが可能です) –

+0

@Andras Zoltan、そうです、既存のファイルあなたの答えからroutes.RouteExistingFiles = trueを追加する必要があります。 –

+0

私が上に述べたように、私のために働いていたのは、ScottとAndrasの両方の回答を統合することでした。私はAndras 'を答えとしてマークしたので、この質問でカバーされていなかった経路構成や最初にリンクした経路構成へのポインタを追加しました。 –

関連する問題