我目前實現了一個簡單的資產管理器,它允許我在外部文件和聯機中管理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()方法似乎仍然遭受同樣的警告,即在渲染調用之後包含的任何文件都不會被處理。希望有一個解決方法,但現在我很高興。
我確實檢查過,但我完全錯過了開源的下載鏈接。將檢查出來,謝謝! – Geekman 2011-03-10 14:59:31
看起來不錯。 Telerik的經理似乎使用與該博客文章類似的語法,但至少它獲得了StyleSheet管理!仍然需要調查注入內聯JS/CSS的最佳方式。但是,謝謝! – Geekman 2011-03-10 15:34:49
@Geekman,讓我知道你的決定。我實際上在做類似的事情。檢查我目前打開的問題:http://stackoverflow.com/questions/5255223/asp-net-directive-convention-for-declaring-client-side-includes。這就是我現在的路徑。 – smartcaveman 2011-03-10 15:45:48