2011-03-10 48 views
1

我目前實現了一個簡單的資產管理器,它允許我在外部文件和聯機中管理CSS和JavaScript資源。在ASP .NET中實現css和javascript資產管理器MVC

我期待,以改善我的代碼中使用它的方式,但我希望能夠以這樣一種方式,它可以從訪問都我的輔助功能我的看法使用它。

目前調用它,我做的事情,像這樣:

在我的助手:

public void MyHelper(this HtmlHelper helper) 
{ 
    JavascriptAssetManager.Current(helper.ViewData, typeof(JavascriptAssetManager)).Inline(@"alert('Some javascript!');"); 
} 

在我的看法:

<% CssAssetManager.Current(this.ViewData, typeof(CssAssetManager)) 
     .Add(Url.Content("~/Content/styles.css")); %> 

我有兩個實例AssetManager類(每個類),並將它們存儲在ViewDataDictionary中,這是唯一的方法我發現我可以存儲每個頁面請求對象,這對我的幫助者和我的視圖都是可訪問的。

我的當前方法在基本抽象類中實現(這就是爲什麼我必須將子對象的類型傳遞給方法)。這允許我爲Javascript和CSS實現單獨的呈現函數(包括和內聯語句)。

我的最終目標將是修改的解決方案,這樣我可以使用它是這樣的:

public void MyHelper(this HtmlHelper helper) 
{ 
    helper.Scripts.Inline(@"alert('whatever');"); 
} 

<% Css.Add(Url.Content("~/Content/layout.css")); %> 

我已經看過其他的解決方案,並嘗試一個或兩個。也就是這個:http://weblogs.asp.net/rashid/archive/2009/05/02/script-and-css-management-in-asp-net-mvc-part-2.aspx

它真的很不錯,但我發現它很煩人地圍繞我的HTML Helpers包括一些簡單的JS ...爲了讓Lamba行動工作,我最終不得不做一些像:{ 「警報( '不管');」 的ToString()}

()=>

試圖再通過C#變量納入這就是打破了我......我還是喜歡我的參數化字符串。格式()基於內聯方法(儘管我不喜歡把花括號加倍)。

我的觀點是:我完全打開我的代碼,只是使用第三方的東西,如果有人可以推薦一些行之有效的東西。 我真的很想管理CSS以及JavaScript。

這是當前方法,因爲我現在;我會很樂意提供更多(全部)代碼:

public static BaseAssetManager Current(ViewDataDictionary ViewData, Type InstanceType) 
    { 
     string viewDataKey = InstanceType.Name + "-ViewData"; 

     //If not instanciated yet, create it: 
     if (!ViewData.ContainsKey(viewDataKey) || ViewData[viewDataKey] == null) 
     { 
      var instance = (AbstractAssetManager)Activator.CreateInstance(InstanceType); 
      ViewData[viewDataKey] = instance; 
      return instance; 
     } 

     return (AbstractAssetManager)ViewData[viewDataKey]; 
    } 

作爲獎勵,這將是很高興能夠有CSS文件包含在我的幫手/貫穿意見,但後來都有了把標籤內。

我發現我的解決方案,因爲我打電話給母版頁眉的渲染代碼,所以在我的視圖內進行的任何包含調用只是被省略。

大概是因爲調用和編譯東西的順序。我最終只是在頁面頁腳處渲染所有的CSS來繞過這一點,因爲它對於我來說更重要(現在)能夠幫助我的助手在運行時確定頁面上需要哪些文件。

如果你願意的話,可以讓我爲那種不好的做法而生火焰,但我還沒有達到任何需要優化的地步。 :)

謝謝大家!

編輯:基於@ smartcaveman的帖子


,我一直在嘗試了Telerik的網絡資產樣式和腳本登記。這似乎很大程度上基於我提到的博客文章,也許作者與他們有關聯?

Telerik版本中有很多額外的功能,但有一個幫助的是OnDocumentReady()重載,它接受一個字符串來執行內聯Javascript。

我絕對不會在內聯JS中使用任何重要的東西,但是如果您在外部文件中包含所有JS函數(可以動態包含),它肯定會有所幫助。然後,只要輸入(HTML幫助器等)需要調用JS函數就可以調用一行代碼。

它將所有的OnDocumentReady()方法調用到我的腳註中的一個JavaScript內聯代碼塊中,我稱之爲Render()。

這正是我所追求的。

不幸的是,在樣式表中調用Render()方法似乎仍然遭受同樣的警告,即在渲染調用之後包含的任何文件都不會被處理。希望有一個解決方法,但現在我很高興。

回答

3

Telerik的ASP.NET MVC擴展具有出色的網絡資產管理器。描述在這裏:http://www.telerik.com/products/aspnet-mvc/web-asset-managers.aspx。您也可以從右側的面板下載開源代碼。避免重新發明輪子通常是一個好主意,而這個組件可以完成所有你需要的功能以及更多功能。

+0

我確實檢查過,但我完全錯過了開源的下載鏈接。將檢查出來,謝謝! – Geekman 2011-03-10 14:59:31

+0

看起來不錯。 Telerik的經理似乎使用與該博客文章類似的語法,但至少它獲得了StyleSheet管理!仍然需要調查注入內聯JS/CSS的最佳方式。但是,謝謝! – Geekman 2011-03-10 15:34:49

+0

@Geekman,讓我知道你的決定。我實際上在做類似的事情。檢查我目前打開的問題:http://stackoverflow.com/questions/5255223/asp-net-directive-convention-for-declaring-client-side-includes。這就是我現在的路徑。 – smartcaveman 2011-03-10 15:45:48

2

有一個新的.net開放源代碼資產管理器,運行在Github上,名爲Cassette。它有一個乾淨的語法,支持樣式表,CoffeeScript和html模板。如果您的網站正在生產(debug = false),它將最小化和組合腳本,並根據文件散列對它們進行緩存。

0

Telerik的ASP.NET MVC擴展不是免費的。我最近碰到下面的解決方案:http://weblogs.asp.net/rashid/archive/2009/04/28/script-and-css-management-in-asp-net-mvc.aspx

+0

儘管Telerik擴展可能不完全免費,但有一個開源版本 - 可以由其他開源應用程序合法使用。我已經在一些應用程序中使用過它們。 http://www.telerik.com/products/aspnet-mvc/getting-started/licensing.aspx。不確定你是否看到過,但我確實鏈接到了Rashid博客上的其中一篇文章 - 而且我確實嘗試過,但發現那裏有一些我不喜歡的東西 - 我相信這個解決方案實際上是一個早期版本這是Telerik發佈的。據我瞭解,他爲他們工作。 – Geekman 2011-11-22 01:49:23

+0

你可以在商業軟件中免費使用Telerik的ASP.NET MVC擴展嗎? – 2011-11-24 14:09:33

+0

我想,沒有什麼能阻止你。但根據GPL v2協議,開放源代碼版本必須遵守該協議,這是不合法的。我猜如果你確實在商業應用中使用它,如果發現的話,你就冒着法律訴訟的風險。 – Geekman 2011-11-27 10:09:49