2012-08-14 67 views
2

我在一個似乎正在工作的網站上設置網址路由,但我無法讓它忽略我的JavaScript文件。我有使用ASP.NET開發服務器和IIS 7相同的問題。我沒有使用mvc。ASP.NET 4.0路由忽略.js .css等

我曾嘗試以下每個忽略的JavaScript沒有成功

routes.Add(new Route("Scripts/", new StopRoutingHandler())); 
    routes.Add(new Route("Scripts/{*pathInfo}", new StopRoutingHandler())); 
    routes.Add(new Route("{resource}.js", new StopRoutingHandler())); 
    routes.Add(new Route("{resource}.js/{*pathInfo}", new StopRoutingHandler())); 
    routes.Add(new Route("*.js", new StopRoutingHandler())); 
    routes.Ignore("Scripts/{*pathInfo}"); 
    routes.Ignore("{file}.js"); 
    routes.Ignore("{resource}.js/{*pathInfo}"); 
    routes.Ignore("Scripts/{*pathInfo}"); 
    routes.Ignore("{folder}/{*pathInfo}", new { folder = "Scripts" }); 
    routes.Ignore("{*alljs}", new { alljs = @".*\.js(/.*)?" }); 
    RouteTable.Routes.Ignore("{resource}.js/{*pathInfo}"); 
    RouteTable.Routes.RouteExistingFiles = false; 

下面是一個基本的測試頁面,我創建隔離問題

的Global.asax包含

void Application_Start(object sender, EventArgs e) { 
    RegisterRoutes(RouteTable.Routes); 
} 

void RegisterRoutes(RouteCollection routes){ 
    routes.Ignore("{*alljs}", new { alljs = @".*\.js(/.*)?" });   
    routes.MapPageRoute("testpage", "testpage", "~/testpage.aspx"); 
    routes.MapPageRoute("area", "testpage/area/{name}", "~/testpage.aspx"); 
} 

testpage.aspx: -

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testpage.aspx.cs" Inherits="testpage" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test.aspx</title> 
     <script type="text/javascript" src="./Scripts/test.js"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <p id="jsLoaded">false</p> 
    </form> 
</body> 
</html> 

testpage.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class testpage : System.Web.UI.Page{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Page.RouteData.Values.ContainsKey("name")) { Response.Write(Page.RouteData.Values["name"].ToString()); } 
    } 

}

test.js

window.onload = function() { 
    if (document.getElementById('jsLoaded')) { 
     document.getElementById('jsLoaded').innerHTML = 'test.js loaded'; 
    } 
} 

導航到網站/ testpage /區域/ AREANAME顯示路由的工作,但JavaScript文件是不加載。這讓我瘋狂!

Henry

回答

2

IIS正在接管服務這些文件。您將不得不限制它們在IIS中提供服務並忽略到該位置的任何路由。一個選項將轉到IIS - >請求過濾 - >規則並添加一個新的規則來限制訪問。然而,我確定你知道,如果你限制這些文件被服務,腳本將永遠不會運行在客戶端上,如果這意味着要發生,爲什麼不把網站外的物理文件移動到一個無法訪問的位置?

+0

我需要我的JavaScript(和CSS,圖像等)是給客戶端可見 – Henry 2012-08-15 10:31:51

+0

那麼它歸結爲一個選擇。如果您希望客戶端能夠查看圖像並在訪問時讓JavaScript爲您的網站運行,那麼它必須被允許提供給他們的機器。如果你告訴我爲什麼要限制文件,這可能會幫助我更清楚地回答問題。 – Matt 2012-08-15 16:33:15

+0

對不起,如果我不清楚,我不想限制訪問。目前我有我的網站使用查詢字符串,如網站/ testpage.aspx 和site/testpage.aspx?area = areaname我想使用路由,並仍然有我的JavaScript運行時,通過類似 網站訪問頁面/測試頁和網站/測試頁面/區域/ areaname 我認爲這將通過告訴路由不路由JavaScript,但也許我誤解了它的功能來實現。 – Henry 2012-08-19 10:23:16

0

爲什麼不爲你ResolveUrl這樣的JavaScript文件?

<script type='text/javascript' src='<%= ResolveUrl("~/Scripts/test.js") %>'></script> 

也有你這麼幹,

RouteTable.Routes.IgnoreRoute("{*alljs}", new {[email protected]".*\.js(/.*)?"}); 

參考:http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

+0

這將如何幫助他忽略.js文件? – Matt 2012-08-14 17:12:05

+0

@Mattbo:一般的做法是解決標記而不是忽略它們global.asax – naveen 2012-08-14 20:29:18

+0

這可能會工作,但由於我的網站上有大量的.js,.css文件,我希望有一個解決方案可以讓我使用ASP。NET路由而不必改變我所有文件的所有引用。在閱讀了許多其他使用這些類型的文件忽略路由成功的情況下,我認爲這是可能的,而且我正在實現它不正確。如果沒有,我將不得不咬牙,並使用ResolveUrl方法。謝謝 – Henry 2012-08-15 10:40:09