2009-04-20 27 views
2

我爲ASP.NET MVC UrlHelper創建了一個簡單的擴展方法。它不需要任何參數,因爲它的工作是從配置中查找樣式表文件的名稱,並將url返回到樣式表。擴展方法看起來大致是這樣的:UrlHelper擴展方法調用編碼未執行

public static string SiteStylesheet(this UrlHelper urlHelper) 
{ 
    var scriptFilename = UserInterfaceConfiguration.GetSection() 
          .Mvc.SiteStylesheet; 
    return urlHelper.Content(string.Format("~/Assets/Scripts/{0}", 
              scriptFilename)); 
} 

我用它是這樣的:

<link href="<%= Url.SiteStylesheet() %>" rel="Stylesheet" type="text/css" /> 

的方法沒有得到,不過執行,顯示以下內容:

href="../Views/Shared/%3C%25=%20Url.SiteStylesheet()%20%25%3E" 

正如你所看到的擴展方法未被執行,而整個事物只是被編碼。如果我改變方法簽名接受一個參數:

public static string SiteStylesheet(this UrlHelper urlHelper, string dummy) 

然後執行擴展方法,並如預期輸出:

href="/Assets/Stylesheets/FluidCMS.css" 

所以我的問題則是這種設計或者這是一個ASP.NET MVC Web窗體視圖引擎中的錯誤?

回答

3

這個問題已經出現了很多次。問題的根源在於head> tag有runat =「server」,這會導致解析器將標記視爲服務器標記。

最簡單的解決方法是從head標籤中刪除runat =「server」。你失去的是使鏈接URL相對於當前頁面的邏輯,但是由於無論如何你都使用了你的幫手,所以你不需要這個。

3

當我遇到這個問題時,這是因爲我的擴展方法位於web.config中未指定的名稱空間中。

<add namespace="Your.Extension.Method.Namespace"/> 

它去下配置\的System.Web \ \網頁命名空間

+1

謝謝,但包含我的擴展方法的命名空間是在web.config中,我仍然看到相同的行爲。 – user93255 2009-04-22 14:24:35

+1

謝謝,我自己陷入了這個問題。也沒有注意到,有2個web.configs – 2009-05-12 22:28:47

0

我想你發現了一個bug!

我試過了,發現這種情況只發生在母版頁的頭部,並且只在<link>標籤(<script>標籤渲染正常)中發生。

問題顯然是de href屬性中的文本沒有被正確解釋爲代碼塊。

這超出了ASP.NET MVC。我在經典的Web窗體ASP.NET網站的母版頁中嘗試過,問題依然存在。它似乎是Web窗體渲染引擎或類似的東西中的一個錯誤。