2011-02-26 46 views
15

我發現此問題Can't use relative paths with areas in ASP.NET MVC 2這是我遇到的同一問題。這在MVC3中仍然如此嗎?MVC3區域中的相對內容路徑

有沒有辦法將內容文件保存在相對於該區域的區域中?

因此,在一個區域佈局文件可以有類似

而不必要麼做一個完全合格的鏈接,要求區目錄和地區名稱或對上述問題的解決方案需要檢查每個請求上的每個區域。

更新/編輯

我決定同時使用在上述問題的解決方案和下面的一個(HTML輔助) - 根據項目/情況。我的上述實現使用app.setting來存儲區域名稱和擴展名,以便我可以將模塊作爲我的庫的一部分。

var context = HttpContext.Current; 
var path = context.Request.Path; 
var list = ...  //code that gets from app.config and then saves it 
var extensions = ... // to the cache as non-removable with a dependency on web.config 
foreach (var area in list) 
{ 
    if (!path.Contains(area + "/")) continue; 
    foreach (var extension in extensions) 
    { 
     if (path.EndsWith("." + extension)) 
     { 
     context.RewritePath(path.Replace(area + "/", "Areas/" + area + "/")); 
     } 

    } 
} 

回答

4

你可以嘗試創建上的HtmlHelper的一個推廣工作了這一點:

public static string Image(this HtmlHelper html, string imagePath) 
{ 
    var area = html.ViewContext.RouteData.Values["area"]; 
    if (!string.IsNullOrEmpty(area)) 
     area = "Areas/" + area + "/"; 
    return VirtualPathUtility.ToAbsolute("~/" + area + "Content/img/" + imagePath); 
} 

所以在你看來,你可以使用:

<img src="@Html.Image("myimage.png")" alt="..." /> 

我沒有嘗試代碼,以便糾正我,如果我錯了。

+1

我喜歡這個解決方案。不過,我想知道速度如何:檢查模塊中的路徑或字典查找,然後檢查。即使如此,這可以通過各種技巧進行優化。 – 2011-02-28 14:34:30

+0

另一個好處是,上述問題中提供的解決方案不允許參考該區域以外的資產,因爲它總是會嘗試重新映射到可能不需要的區域。 – 2011-02-28 15:42:45

-1

我有類似的問題,我的ASP.NET MVC 3 web應用程序和我固定它寫的不是

<img src="mypath/myimage.png" alt="my alt text" /> 

這樣的:

<img src='@Url.Content("mylink")' alt="my alt text" /> 

其中最後myLink的是路徑像〜/ mypath。我用它來鏈接到我的JavaScript文件,但是我並沒有使用圖片或鏈接,所以你應該嘗試自己嘗試一下......

+0

它不會在區域內工作。它指向根,並忽略它在一個區域內發起的事實。 – 2011-02-28 13:38:54

18

我個人喜歡擴展方法的路線,基於第一個答案我想出了這個,並測試它的工作原理...而不是使用@Url.Content,使用@Url.ContentArea,並且不需要放入'〜/','/ 「或」 ../」,等等。

助手做了一些檢查,以自動刪除這些,所以只是用的是這樣的...

@Url.ContentArea("Content/style.css") or @Url.ContentArea("Images/someimage.png") :) 

當您創建以下鏈接輔助程序擴展,您但我在網頁的根目錄下創建了一個'助手'文件夾,然後在我的_Layout.cshtml(剃鬚刀/ mas)中包含@using YourWebNameSpace.Helpers;在我所在的任何「區域」中都可以使用。)

您仍然可以使用@Url.Content作爲當前區域之外的引用(基本上可以根據所需資源和其位置進行組合)。

namespace YourWebNamespace.Helpers 
{ 
    public static class UrlHelperExtensions 
    { 
     public static string ContentArea(this UrlHelper url, string path) 
     { 
      var area = url.RequestContext.RouteData.DataTokens["area"]; 

      if (area != null) 
      { 
       if (!string.IsNullOrEmpty(area.ToString())) 
        area = "Areas/" + area; 

       // Simple checks for '~/' and '/' at the 
       // beginning of the path. 
       if (path.StartsWith("~/")) 
        path = path.Remove(0, 2); 

       if (path.StartsWith("/")) 
        path = path.Remove(0, 1); 

       path = path.Replace("../", string.Empty); 

       return VirtualPathUtility.ToAbsolute("~/" + area + "/" + path); 
      } 

      return string.Empty; 
     } 
    } 
} 

在您的母版頁或任何頁面(Razor僅適用於此示例)...

@using YourWebNamespace.Helpers 

<html lang="en"> 
<head> 

    <link href="@Url.ContentArea("Content/reset.css")" media="screen" rel="stylesheet" type="text/css" /> 

    <link href="@Url.ContentArea("Content/style.css")" media="screen" rel="stylesheet" type="text/css" /> 

</head> 
<body> 
1

我試過UrlHelperExtensions上面的一些圖片,我在我的主頁面中使用它作爲jQuery滾動條幅的數據。我不得不添加以下else子句,這樣,當沒有區域助手將返回塔路:

 else 
     { 
      if (path.StartsWith(@"~/")) 
      { 
       var result = VirtualPathUtility.ToAbsolute(path); 
       return result; 
      } 
     } 

     return string.Empty; 

在我看來,頁面我用:

<img src="@Url.ContentArea("~/images/ScrollPicture1.png")" alt="Gallery picture 1" /> 

感謝張貼此解決方案。非常適合我的圖像修復。

2

我只是在樣式表類似的問題,我剛好在這兩個相對路徑將得到解決:

#searchbox { 
    ... 
    background: url("../Content/magglass.png") no-repeat; 
    background: url("../../Content/magglass.png") no-repeat; 
    ... 
}