5

レガシーアプリケーションに新しい命を加える必要があります:)

クライアントに返す前にページにマークアップを追加するために、「静的」HTMLページが要求されたときにMVCコントローラーを呼び出したいと思います。

このスレッドにあるアプローチに従おうとしました:.htmlページのweb.config設定を読み取る方法は?

...しかし、私はこのルートを定義していますが:

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

コントローラが呼び出されていません。web.configを次のように定義しています。

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

PageHandlerFactory以外の何かを呼び出す必要があるか、問題がまったく異なるものである可能性があります。

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

4

2 に答える 2

6

これを行う場合:

routes.RouteExistingFiles = true;

ハンドラーを追加しなくても、これが機能するはずです。HostingEnvironment.VirtualPathProviderコントローラーでは、のメソッドを使用してHTMLを直接ロードし、それを使用GetFileして何かを行うことができます。または、静的ファイルと同じコンテンツを追加するだけでレンダリングする通常のMVCビューを使用することをお勧めします。

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

于 2012-07-03T22:10:43.157 に答える
3

私はあなたと同じ状況を設定しました、そしてそれは私にとってうまくいきました、それであなたは適切な主要なコンポーネントを持っています。テストとトラブルシューティングのために覚えておくべきいくつかの事柄:

web.configには、html拡張機能のビルドプロバイダーが必要です。

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

ハンドラーのコピーと貼り付けが機能するので、見栄えがします。

また、クリーンなプロジェクトでデフォルトのHomeコントローラーを使用しましたが、MapRouteのコピーアンドペーストも機能します。したがって、再確認として、Index()というActionResultメソッドを持つTopicというコントローラーがあることを確認してください。

また、URLがlocalhost.com:{port}/html/test.htmlであり、パスに/ html /が含まれていることを確認してください。これは、ルールで要求されているためです。

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

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

于 2012-07-03T22:10:14.523 に答える