2013-07-30 12 views
72

~/Viewsフォルダーにある静的ファイル.htmlを要求したいと考えています。 ドキュメントによると、ルーティングシステムは、アプリケーションのルートを評価する前に、URLがディスクファイルと一致するかどうかを確認します。ASP.NET MVCの〜/ Viewsフォルダの下にある静的な.htmlファイルをどのように要求しますか?

しかし、ファイルを要求すると、404エラーが発生します。

私のファイルは〜/ Viewsフォルダにあります。 URLは:http://[localhost]/Views/HtmlPage1.html

私は見逃していますか?

答えて

85

「〜/ Views」フォルダにある静的な.htmlファイルを要求できるようにします。

できません。このフォルダには、そこからファイルにアクセスすることを明示的に禁止するweb.configファイルがあります。クライアントからファイルにアクセスできるようにするには、これらのファイルをASP.NET MVCで特別な意味を持つViewsフォルダに配置しないでください。

HTMLファイルを置くことができる~/Staticフォルダがあります。そして、そのようにアクセス:

http://example.com/yourapplicationname/static/foo.html 
+2

または、代わりにURLが同じ「外観」を持っているので、あなたが... [ビュー]フォルダの中に発見されたコントローラ名構造を模倣することができ、あなたのフォルダ「静的」を命名します。例えば。あなたはplainjane * Edit.html *をViews/Order/Edit.htmlに置くことができないので、〜/ Order/Edit.htmlに入れます – bkwdesign

+2

これは最新のASP.NET(vNext)で変更されましたhtmlファイル用の静的プロバイダを登録するだけでなく、通常のMVC方法を引き続きルーティングします。私はそれを使って素早く遊んでいましたが、それはテストプロジェクトでやったことです。 Linuxでkestrelを実行していますが、IISは同じであるはずです。 – ppumkin

+1

@bkwdesign私のコントローラのデフォルトハンドラを台無しにして、アクセスできないフォルダ構造を模倣することによってその設定が制御されると確信しています。だから、この状況をテストしてください。 –

29

私は 〜/ビュー]フォルダに配置されている静的.htmlファイルを要求することができるようにしたいです。

それは解決策を提供するが、マークされた答えは完全には正しくありません。

マークされた回答の理由は正しいです。Viewsフォルダにweb.config(BlockViewHandler設定を指定)を指定すると、ファイルに直接アクセスできなくなります。 Asp.Net MVCのビューを保護するためにそこにあります。しかし、これらのファイルを直接提供することについて質問した場合、AngularJSの部分的なビュー(私たちの場合のように)を使用して、奇妙な名前でviewsフォルダを複製したくない場合など、正当な理由がある可能性があります。

ここでは、asp.net MVCビューのセキュリティを損なうことなく、Viewsフォルダにあるweb.configファイルで行うことができる非常に簡単な調整があります。これはいつものように.cshtmlファイルを確保したが、JSとHTMLなどのファイルを許可するに

変更この

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 

--to--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
+2

これは、.aspxファイルや.ascxファイルなどの他のファイルやサードパーティのビューエンジンのファイルでは依然として危険です。 cs3xの答えごとにホワイトリストを作成するほうがはるかに優れています。 – pwdst

+1

@pwdst:サーバー側のビューを混在して使用している場合は、個々のタイプをホワイトリストに登録する方が良いかもしれません。私たちは.cshtmlファイルを保護したいので、これを少し冗長にして使用しました。 – Vikas

59

alone.Aあなたの.htmlファイルを残します

<system.webServer> 
<handlers> 
    <add name="JavaScriptHandler" path="*.js" verb="*" 
    preCondition="integratedMode" type="System.Web.StaticFileHandler" />  
    <add name="HtmlScriptHandler" path="*.html" verb="*" 
    preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 

:[ビュー]フォルダ内のビュー・フォルダ内のweb.configファイルを編集します
+7

+ Kameitのブラウニーポイント –

+0

"routes.RouteExistingFiles = true;"という行を削除する必要がありました。 RouteConfig.RegisterRoutesでこれが動作するようにしてください –

+0

マークされた答えには有用な情報が含まれていますが、これはより良い答えです。私の現在のプロジェクトでテストされ、働いています。 –

9

別の代替オプションは、HTMLファイルを

public ActionResult MyHtml() 
{ 
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html"); 
    return result; 
} 

アクセスhttp://yoursite/controller/MyHtmlとしてHTMLを提供するために、所望のコントローラのいずれかで動作方法を挿入することです。このアクションメソッドを拡張して、htmlファイル名をmethod/querystrignパラメータとして受け入れ、実行時にファイルをレンダリングすることができます。

public ActionResult MyHtml(string htmlPageName) 
{ 
     var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html"); 
     return result; 
} 
関連する問題