一个ASP.NET的JS管理方案,欢迎讨论、拍砖
2009-05-13 11:44
417 查看
场景:在自定义控件、用户控件、页面、后台代码都会有引用JS的可能,这就会出现混乱或者重复引用的可能。
一个自定义控件,用于在ASPX页面中注册JS:
一个静态类,用于管理JS和在后台代码(cs文件)中注册JS:
然后写一个基类页面,所有的页面都要继承自这个基类页:
上面是在OnPreRender中将JS注册到Page.Head中的,所以如果在自定义控件中注册JS引用,请在OnPreRender之前引用。
在ASPX页面中注册JS:
在CS页面中注册JS:
最终生成的页面:
在这里是使用HttpContext.Current.Items来保存包含的JS列表。欢迎讨论、改进。
测试代码:JsManager.rar
一个自定义控件,用于在ASPX页面中注册JS:
public class Script : Control { #region 属性 private string m_Src; /// <summary> /// 脚本文件路径 /// </summary> public string Src { get { return m_Src; } set { m_Src = value; } } #endregion /// <summary> /// 在控件Init的时候将JS路径添加到HttpContext.Current.Items["IncludedJavaScript"]中。 /// </summary> /// <param name="e"></param> protected override void OnInit(EventArgs e) { base.OnInit(e); if (!string.IsNullOrEmpty(Src)) { string src = ResolveUrl(Src); List<string> includedJs = HttpContext.Current.Items["IncludedJavaScript"] as List<string>; if (null == includedJs) { includedJs = new List<string>(); HttpContext.Current.Items["IncludedJavaScript"] = includedJs; } if (!includedJs.Contains(src)) { includedJs.Add(src); } } } }
一个静态类,用于管理JS和在后台代码(cs文件)中注册JS:
/// <summary> /// Javascript管理器 /// </summary> public static class JavaScriptManager { /// <summary> /// 包含JS引用。 /// </summary> /// <param name="filePaths"></param> public static void Include(params string[] filePaths) { HttpContext context = HttpContext.Current; if (null == context) { throw new Exception("HttpContext为空。"); } System.Web.UI.Page p = context.CurrentHandler as System.Web.UI.Page; if (null == p) { throw new Exception("HttpContext.CurrentHandler不是Page。"); } IList<string> jss = GetIncludedJavaScript(); string resolveUrl; foreach (string filePath in filePaths) { resolveUrl=p.ResolveUrl(filePath); if (!jss.Contains(resolveUrl)) { jss.Add(p.ResolveUrl(resolveUrl)); } } } /// <summary> /// 获取已经包含的JS列表 /// </summary> /// <returns></returns> public static IList<string> GetIncludedJavaScript() { HttpContext context = HttpContext.Current; if (null == context) { throw new Exception("HttpContext为空。"); } IList<string> jss = HttpContext.Current.Items["IncludedJavaScript"] as IList<string>; if (null == jss) { jss = new List<string>(); HttpContext.Current.Items["IncludedJavaScript"] = jss; } return jss; } }
然后写一个基类页面,所有的页面都要继承自这个基类页:
public class BasePage : System.Web.UI.Page { public BasePage() { } #region 注册/管理JS引用 /// <summary> /// 将引用的JS添加到Page.Head中。 /// </summary> private void InitJS() { IList<string> includedJs = JavaScriptManager.JavaScriptManager.GetIncludedJavaScript(); foreach (string jsFilePath in includedJs) { var script = new HtmlGenericControl("script"); script.Attributes["type"] = "text/javascript"; script.Attributes["src"] = jsFilePath; Page.Header.Controls.Add(script); } } /// <summary> /// 在呈现之前注册JS /// </summary> /// <param name="e"></param> protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); InitJS(); } #endregion }
上面是在OnPreRender中将JS注册到Page.Head中的,所以如果在自定义控件中注册JS引用,请在OnPreRender之前引用。
在ASPX页面中注册JS:
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <lulu:Script runat="server" ID="Script1" Src="~/Test/aspx.js"></lulu:Script> </head> <body> <form id="form1" runat="server"> <div> <lulu:Script runat="server" ID="Script5" Src="~/Test/aspx.js"></lulu:Script> <lulu:Script runat="server" ID="Script6" Src="~/Test/aspx2.js"></lulu:Script> <lulu:Script runat="server" ID="Script7" Src="~/Test/aspx.js"></lulu:Script> </div> </form> </body> </html>
在CS页面中注册JS:
public partial class _Default : BasePage { protected void Page_Load(object sender, EventArgs e) { JavaScriptManager.JavaScriptManager.Include("~/JS/cs.js", "~/JS/cs.js", "~/JS/cs.js2", "~/JS/cs.js"); } }
最终生成的页面:
在这里是使用HttpContext.Current.Items来保存包含的JS列表。欢迎讨论、改进。
测试代码:JsManager.rar
相关文章推荐
- 关于asp.net做大型门户网站的一点讨论,欢迎拍砖
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试
- 发现ASP.NET一个小技巧--真爱生命,远离js、css版本号
- 多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
- ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块
- asp.net 如何使用js来判断一个网页是否处于iframe中
- asp.net 状态管理方案总结
- [Asp.net] 一个基于B/S会员管理系统的知识总结
- 本人有时间做了一个日程安排和名片管理系统,B/S结构,sql+ASP.NET(C#),赠送大家免费使用,需要的请留下EMAIL!
- 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
- ASP.NET MVC+LINQ开发一个图书销售站点(7):图书分类管理
- 最近用asp.net做的一个网站,欢迎大家访问
- 自己写了一个Asp.net探针的源码,希望大家讨论一下
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
- ASP.NET MVC+LINQ开发一个图书销售站点(11):图书管理
- ASP.net 让窗口WEB打开后,弹出一个选择窗口供应选择,注意Page_Load顺序,JS产生的找不到对象的问题
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
- ASP.NET Zero--11.一个例子(4)商品分类管理-数据检验
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)