2012-03-08 4 views
10

내 뷰와 함께 내 javascript 파일을 배치하려고합니다.뷰 폴더에 js 파일 배치

다음 js 파일 위치가 있습니다. /Views/Home/Home.js

그러나 스크립트 태그로 참조하면 404 오류가 발생합니다. SO 다음과 같은 질문으로 당

는 : 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는 해당 폴더의 파일에 대한 모든 요청을 차단합니다. IIS7

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

그리고 위해 : 이것은 당신이 설정 파일에 무엇을 찾을 것입니다

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

솔루션

당신은 와일드 카드를 변경할 수 있습니다 T를 잡으려고 he .cshtml 파일. 이 와일드 카드로

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

<httpHandlers> 
    <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 
의의 .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 설정을 구축했습니다. 나는 또한 특정 자바 스크립트 조각을 사용하는보기가 그 자바 스크립트 파일을로드하게하는 js를 요구하는 AMD'd를 가지고있다. 이와 같이 나는 모든 것을 구획화했고보기와 함께 폴더에있는 mvc 폴더와 결합 된 각도 조절기를 배치하는 것이 합리적이었다. 그래서 나는 views \ ControllerName \ ControllerName.cshtml과 views \ Controller \ ControllerName-controller.js와 같은 것을 가지고있다. –

2

개인적으로 보안상의 이유로 httpHandlers를 가지고 노는 것을 좋아하지 않습니다. 같은 폴더 구조를 두 번 유지해야하는 것을 방지하기 위해 똑같은 일을하고 싶었습니다 (보기 및 스크립트 폴더에서). 따라서 .js 파일을 .cshtml과 동일한 폴더에 저장하고 더 이상 404 오류가 발생하지 않도록하는 것이 목표입니다.

솔루션은 내가 정의 Html 헬퍼 및 호출 자바 스크립트에 대한 컨트롤러를 사용, 그 목표에 도달합니다.Html 헬퍼

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 invokers 및 메서드를 통과하기 때문에 정적 파일을 가져 오는 것이 더 느리지는 않습니까? –

1

내 의견, 이것 좋은 방법입니다. 코드를 간단하게 유지하고 다른 리소스 유형의 보안 문제는 해결하지 않습니다.

는 그냥 핸들러에 섹션에 다음을 추가 :이 작동

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />