我目前实现了一个简单的资产管理器,它允许我在外部文件和联机中管理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