2011-03-10 20 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