2012-03-08 28 views
10

Tôi đang cố gắng đặt các tệp javascript của mình với chế độ xem của mình.Đặt các tệp js vào thư mục lượt xem

Tôi có vị trí tệp js sau. /Views/Home/Home.js

Tuy nhiên, khi được tham chiếu bằng thẻ tập lệnh, kết quả là lỗi 404.

Theo những câu dưới đây SO: ASP.NET MVC - Where do you put your .js files if you dont want to store them in /Scripts?

tôi thêm file.js các tuyến Đăng ký của tôi. (Không giải quyết được sự cố)

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

Tôi có thể lưu trữ và tham chiếu các tệp js của mình bên cạnh quan điểm của tôi bằng cách nào?

Trả lời

24

Vấn đề là, vì lý do bảo mật, tệp web.config nằm trong thư mục Chế độ xem sẽ chặn tất cả yêu cầu vào tệp trong thư mục đó. Đây là những gì bạn sẽ tìm thấy trong tập tin cấu hình:

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

Và đối với IIS7:

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

Giải pháp

Bạn có thể thay đổi các ký tự đại diện để chỉ bắt t các tệp .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> 

Với ký tự đại diện này, các tập tin .js sẽ không bị chặn.

+1

này hoạt động, nhưng tôi nghĩ đó là một ý tưởng tốt hơn để không đặt các file js trong thư mục xem. – ErikE

+2

Nó là an toàn hơn không chắc chắn để danh sách trắng các tập tin bạn rõ ràng muốn cho phép theo câu trả lời tại http://stackoverflow.com/questions/604883/where-to-put-view-specific-javascript-files-in-an-asp -net-mvc-ứng dụng thay vì chỉ yêu cầu bộ lọc cho các tệp cshtml. – pwdst

+1

Đối với tôi, tôi đã xây dựng một thiết lập MVC sử dụng nhiều góc cạnh. Tôi cũng đã AMD tất cả mọi thứ với yêu cầu js vì vậy chỉ xem bằng cách sử dụng một số miếng javascript gây ra những tập lệnh java để tải. Như vậy tôi đã phân chia tất cả mọi thứ và nó đã có rất nhiều ý nghĩa để đặt bộ điều khiển góc kết hợp với một thư mục mvc trong thư mục với khung nhìn. Vì vậy, tôi có một cái gì đó như xem \ ControllerName \ ControllerName.cshtml và xem \ Controller \ ControllerName-controller.js. –

2

Tôi personnaly không thích chơi với httpHandlers vì lý do bảo mật. Tôi muốn làm điều tương tự để ngăn chặn việc phải duy trì cùng một cấu trúc thư mục hai lần (trong dạng xem và trong thư mục tập lệnh). Vì vậy, mục tiêu là lưu trữ .js trong cùng thư mục với tệp .cshtml của tôi và không còn lỗi 404 nữa.

Giải pháp

Để đạt được mục tiêu đó, tôi sử dụng một HtmlHelper tùy chỉnh và điều khiển cho javascript gọi.

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 khiển

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"); 
    } 

Sau khi thực hiện, bạn chỉ cần phải thêm đoạn mã sau vào Xem bạn/PartialView

@Html.JScriptBlock() 
+0

Tôi thực sự thích điều này, nhưng không phải là chậm hơn để có được những tập tin tĩnh vì nó đi qua rất nhiều người hút thuốc và phương pháp cho đến khi đạt được các tập tin thực tế? –

1

Trong tôi ý kiến, điều này là một cách hay: nó giữ mã đơn giản và không chạm vào vấn đề bảo mật với các loại tài nguyên khác.

Chỉ cần thêm sau trong xử lý phần:

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
Các vấn đề liên quan