2012-03-08 9 views
10

私のビューにjavascriptファイルを配置しようとしています。ビューフォルダにjsファイルを配置する

私は以下のjsファイルの場所を持っています。 /Views/Home/Home.js

ただし、スクリプトタグで参照すると404エラーになります。以下のSO質問を1として

ASP.NET MVC - Where do you put your .js files if you dont want to store them in /Scripts?

私は私の登録ルートにfile.jsを追加しました。 (問題は解決しませんでした)

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

ビューの横にjsファイルを保存して参照するにはどうすればよいですか?

答えて

24

セキュリティ上の理由から、Viewsフォルダ内のweb.configは、そのフォルダ内のファイルに対するすべての要求をブロックするという問題があります。これは、あなたが設定ファイルで見つけるものです。

<httpHandlers> 
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

とIIS7のために:

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

ソリューション

ワイルドカードを変更することができます唯一のtをキャッチする彼は.cshtmlファイルです。このワイルドカードで

<httpHandlers> 
    <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

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

、の.jsファイルはブロックされません。

+1

これは動作しますが、私はそれがビューフォルダ内のjsファイルを置かない方が良いアイディアだと思います。 – ErikE

+2

明示的に許可したいファイルをhttp://stackoverflow.com/questions/604883/where-to-put-view-specific-javascript-files-in-an-aspでホワイトリストに載せることは間違いなく安全です-net-mvc-applicationではなく、cshtmlファイルの要求をフィルタリングするだけです。 – pwdst

+1

私にとって、私は角度を大いに利用するMVCセットアップを構築しました。私はAMDが必要とするすべてのものを持っているので、特定のjavascriptを使用しているビューでは、それらのJavaスクリプトファイルがロードされます。このように、私はすべてを区画化し、フォルダ内のmvcフォルダに関連付けられた角度コントローラをビューに置くことは非常に意味がありました。ですから、私はviews \ ControllerName \ ControllerName.cshtmlとviews \ Controller \ ControllerName-controller.jsのようなものを持っています。 –

2

私は個人的には、セキュリティ上の理由からhttpHandlerでプレーしたくありません。私は、同じフォルダ構造を2度(ビューとスクリプトフォルダ内で)維持しなければならないのを防ぐために、全く同じことをしたかったのです。だから、私の.cshtmlと同じフォルダに.jsを保存し、もはや404のエラーがないようにすることが目標です。その目標を達成するために

ソリューション

、私は、カスタムのHtmlHelperとJavaScript呼び出しのためのコントローラを使用しています。一度行わ

のHtmlHelper

public static MvcHtmlString JScriptBlock<TModel>(
     this HtmlHelper<TModel> html 
    ) 
    { 
     // Get the physical path of the .js file we are looking for. 
     string path = ((System.Web.Mvc.RazorView)html.ViewContext.View).ViewPath.Replace(".cshtml", ".js"); 
     path = HostingEnvironment.MapPath(path); 

     if (!File.Exists(path)) 
      return null; 

     // We store the physical path in a session variable with GUID as the key 
     string guid = Guid.NewGuid().ToString(); 
     HttpContext.Current.Session[guid] = path; 

     // Create the script block where the src points to the JScript controller. We give the GUID as parameter. 
     return MvcHtmlString.Create("<script src='/JScript/?id=" + guid + "'/>"); 

    } 

JScriptのコントローラー

public ActionResult Index(string id) 
    { 
     // id correspond to the guid generated by the MSRJScript helper 

     // We look if the physical path of the .js is available in the session variables 
     if(Session[id] == null) 
      return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

     // If the physical path was found, we simply send the file back to the browser. 
     string path = Session[id].ToString(); 
     Session.Remove(id); 

     return File(path, "application/javascript"); 
    } 

、単にあなたのビュー/ PartialViewに私には

@Html.JScriptBlock() 
+0

実際にこのファイルが好きですが、実際のファイルに到達するまでに多くのmvc invokerとメソッドを経由するので、静的ファイルを取得するのが遅くなりませんか? –

1

を次のコードを追加する必要があります意見、これコードは単純であり、他のリソースタイプのセキュリティ問題には触れません。

だけセクションハンドラに次の行を追加します。

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
関連する問題