2012-10-21 73 views
3

我有一個Web窗體應用程序在ASP.NET 4.0下C#。那麼我開始考慮應用頁面路由來掩蓋我的內部資源組織,所以我在This Question中問過並接受了答案。ASP.NET路由導致頁面資源不加載

一點背景

我的問題是,應用路由時,所考慮的頁面將被正確傳送,這意味着我通過不同的路徑到達頁面(邏輯,而不是物理的),但圖片,樣式並且外部資源不能正確呈現(完全不能)。

但讓我們更詳細。我加了一些基本路線我的網頁作爲Global.asax文件遵循如下:

<%@ Application Language="C#" %> 

<script runat="server"> 

    void Application_Start(object sender, EventArgs e) { 
    // Registering routes 
    this.RegisterRoutes(System.Web.Routing.RouteTable.Routes); 
    } 

    void Application_End(object sender, EventArgs e) { 
    ... 
    } 

    void Application_Error(object sender, EventArgs e) { 
    ... 
    } 
    void Session_Start(object sender, EventArgs e) { 
    ... 
    } 

    void Session_End(object sender, EventArgs e) { 
    ... 
    } 

    void RegisterRoutes(System.Web.Routing.RouteCollection routes) { 
    // Handling blog posts 
    routes.MapPageRoute(
     "BlogRoot", 
     "blog/posts", 
     "~/Blog.aspx"); 
    routes.MapPageRoute(
     "BlogPosts", 
     "blog/posts/{post-id}", 
     "~/BlogPost.aspx"); 
    } 

</script> 

問題

好了,在某一個點,當我想試試我的新路徑,我這樣做。通常,查看我的博客我總是這樣做:http://localhost/MyWebSite/Blog.aspx和我的博客文章都顯示。我又這樣做了,沒有問題。然後我嘗試輸入:http://localhost/MyWebSite/blog/posts並且頁面正確路由。但有一個問題。瀏覽器不加載圖像和樣式。

我懷疑...

它喜歡它會嘗試獲取的圖像和鏈接樣式從我所提供的開始,但作爲一個合乎邏輯的,它會失敗!頁面看起來與內容,內容都在那裏,但是當涉及到圖像,CSS的東西和從頁面本身外部鏈接的所有東西,以及它不會被瀏覽器加載。

我想檢查我的html,但這並不奇怪,就像我通常不使用路由時一樣。所以下面是我的網頁顯示一些圖像的鏈接和一些CSS夾雜物的摘錄:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head> 
<title> 
    This is my blog 
</title> 
<meta name="author" content="Me, myself and I" /> 
<meta name="keywords" content="blog, personal information, personal page" /> 
<meta name="description" content="Personal Blog" /> 
<meta name="language" content="en-us" /> 
<meta name="copyright" content="Me - Year" /> 
<link rel="shortcut icon" href="Images/FavIco.jpg" /> 
<link href="Styles/Style1.css" rel="stylesheet" type="text/css" /> 
<link href="Styles/Style2.css" rel="stylesheet" type="text/css" /> 
    <script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script> 
    <script type="text/javascript" src="Scripts/jquery-1.4.1-vsdoc.js"></script> 
    <script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script> 
<link href="Scripts/google-code-prettify/src/prettify.css" rel="stylesheet" type="text/css" /> 
<script src="Scripts/google-code-prettify/src/prettify.js" type="text/javascript"></script> 
... 

My web site is structured in this way, in the root folder I have all my web pages and there is also a folder called `Images` where, inside, there are all images. In the root folder I also have the folder `Styles` with all css stylesheet inside it. There is also a folder called `Scripts`. 

以下是另一個摘錄,顯示我body的一部分:

<div class="main"> 
    <div class="navbar"> 
     <span id="WebSite_SiteMapPath"><a href="#WebSite_SiteMapPath_SkipLink"><img alt="Skip Navigation Links" height="0" width="0" src="/WebResource.axd?d=YSaZQjo4n2xp9k-WqUJlK9ILtJOv6g5YNS2VyAf4VpYsZPmq-FcXDtnA5jQ1uPO3rQgDza-fEJKO1qU_C8uSY-WJiCQ7055T8wpvl9SIRFc1&amp;t=634608253861201595" style="border-width:0px;" /></a> 
     <span> 
      <span class="sitenav">Home page</span> 
     </span><a id="WebSite_SiteMapPath_SkipLink"></a> 
     </span> 
    </div> 
    ... 

我覺得莫名其妙瀏覽器嘗試使用提供的地址將其附加到它找到的東西,並確定資源的確切位置。但是這是一個邏輯地址,它失敗了。我認爲很多人使用路由,他們如何解決這個問題?談論最佳實踐?

三江源

+0

你能告訴圖像標籤是如何生成的HTML渲染? –

+0

完成!我認爲這應該就足夠了,還有CSS內含物和圖像內含物。 – Andry

回答

1

看起來這是因爲你的CSS /腳本包括對當前頁面的相關鏈接,因爲你的路由網址已在URL附加水平,他們的瀏覽器所請求的網址有誤。做最好的辦法是讓ASP.NET爲您解決問題,所以不是這樣做的:

<link href="Scripts/google-code-prettify/src/prettify.css" rel="stylesheet" type="text/css" /> 

試試這個:

<link href="<%= Page.ResolveUrl("~/Scripts/google-code-prettify/src/prettify.css") %>" rel="stylesheet" type="text/css" /> 
+0

我可以稍後在下班時應用一些編輯,但是我應該爲所有鏈接執行此操作嗎?還請注意,我有用戶插入的動態內容寫入圖像和東西的鏈接...這是不是有點不方便? – Andry

+1

我認爲這將是最可靠的,儘管還有其他選擇(例如,讓所有包含runat = server並以〜/開頭的URL)。如果你可以保證你的網站運行在根目錄下(你似乎在使用一個名爲MyWebSite的應用程序,所以你不在根目錄下),你可以讓你的鏈接爲相對路徑,並以/開頭。如果您使用相對URL,則必須注意URL結構,因爲您更改了路由,所以不希望阻止加載css /腳本。 – JonoW

+0

是的,這是有道理的,你是對的。我認爲使用從根開始的路徑可能會很好。我可以爲他們安排路線嗎?考慮我有一個圖像或腳本的鏈接,就像您在答案中報告的那樣,我可以插入一條規則來映射類似'style/{style-name}的樣式'並重定向到該目錄,並在我的鏈接?我的意思是我的鏈接的邏輯路徑呢? – Andry