首页 > 代码库 > Asp.net MVC在View里动态捆绑压缩引用的js
Asp.net MVC在View里动态捆绑压缩引用的js
前言
Asp.net MVC 4以上版本多了BundleConfig.RegisterBundles方法,可以把要捆绑的脚本或样式进行捆绑压缩,以减少客户端的请求次数从而提高了客户端的访问速度。
问题
但世上懒人的数量还是很多,我也是一个,觉得这个方法还不够方便。在实际中,一些小的页面或独立页面,开了一些开源的js库之后,js文件比较多,而且每个页面引用的js又不太一样,如果能不在BundleConfig描述如何捆绑,像传统一样把js拉过来就能自动达到捆绑后的效果,是懒人多想要的结果。正是朝着这个目标,本随笔将实现一个html的扩展方法,来完成这个功能。你只要像传统一样把js拉到view上,改几个字符,就可以达到了效果了,引入的js还是有智能提示的。
调用方法
@Html.BundleScripts( @<script src=http://www.mamicode.com/"~/Scripts/jquery-1.7.1.min.js"></script>, @<script src=http://www.mamicode.com/"~/Scripts/login.js"></script>, @<script src=http://www.mamicode.com/"~/Content/validBox/validBox.js"></script>)
如上,把要捆绑的js都当BundleScripts的参数就可以了,效果如下:
BundleScripts的实现
/// <summary> /// 动态捆绑多个脚本 /// </summary> /// <param name="htmlHelper"></param> /// <param name="scripts">javscript</param> /// <returns></returns> public static IHtmlString BundleScripts(this HtmlHelper htmlHelper, params Func<object, object>[] scripts) { if (scripts == null) { throw new ArgumentNullException("scripts"); } var inputs = new StringBuilder(); foreach (var script in scripts) { inputs.AppendLine(script.Invoke(null).ToString().ToLower()); } var applicationPath = htmlHelper.ViewContext.HttpContext.Request.ApplicationPath; Func<string, string> fixSrc = http://www.mamicode.com/(src) => applicationPath == "/" ? "~" + src : src.Replace(applicationPath, "~/"); var srcs = inputs.ToString().Matches(@"(?<=src="").+?\.js(?="")").Select(item => fixSrc(item)).ToArray(); var path = string.Format("~/{0}", Math.Abs(string.Join(string.Empty, srcs).GetHashCode())); if (BundleTable.Bundles.GetBundleFor(path) == null) { BundleTable.Bundles.Add(new ScriptBundle(path).Include(srcs)); } return Scripts.Render(path); }
注:Matches方法是一个对正则表达式的包装。
提问和思考
你觉得此方法的关键之处在哪里?欢迎提问,我们一起探讨,最好能实现一个比此方法更方便的方法来。
Asp.net MVC在View里动态捆绑压缩引用的js
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。