简介
对于asp.net开发人员来说,管理项目中的javascript都很随意:
我想这很大程度上可能是因为网上没有如何妥善处理asp.net中javascript的可靠信息。此文的目的就是提供一种最佳方案,用于管理asp.net中的javascript。该方案将能解决以下问题:
内联js:把js直接放在页面中将导致页面臃肿不堪。
发布js:经常忘记发布js文件。
错误引用:在其它web程序中引用js时经常失败。
依赖性:需要记住js文件中错综复杂的依赖关系。
无效引用:页面上引用的js从来没有被用到。
http/https:跨https页面引用http的js。
重构:重构一个新版本将花费大量时间。
冗余:多次引用统一个js文件。
预备知识
确保已安装visual studio 2010。express版可能不支持此文涉及到的一些概念。
概述
大部分上述问题是由把js或js文件引用直接放到aspx页面引起的。对几乎所有上述问题的解决方法是使用asp.net的内置功能来嵌入js文件到一个dll,然后动态引用这些文件。本文将演示这些功能,以及一些充分使用它们的技巧。接下来我们将逐步介绍该如何实现。
开始
第一步,启动visual studio 2010,并新建一个名为parchmentpurveyor的空web程序。
接下来添加一个窗体:default.aspx,并添加一些简单的html代码。大致如下:
<%@ page language="c#" autoeventwireup="true" codebehind="default.aspx.cs" inherits="parchmentpurveyor.default" %><html xmlns="http://www.w3.org/1999/xhtml"><headrunat="server"> <title>parchment purveyor</title></head><body> <form id="form1" runat="server"> <h1>parchment purveyor</h1> <p>paper for printers, painting, publication, paper planes, and plenty of other plebeian projects!</p> </form></body></html>
添加js
不同于在站点中添加js文件,我们新建一个项目,用于包含我们所有的js文件。在解决方案中添加一个新的类库项目javascriptlibrary:
项目添加后删除class1.cs文件,右键项目,选择添加文件夹,并命名为javascript,然后在该文件夹中添加两个js文件,分别为showmessage.js和greetuser.js,下一步,在项目中添加一个类javascripthelper(注意不要放到javascript目录下),现在解决方案目录结构如下:
接下来编写js,在showmessage.js中添加如下代码:
function showmessage(msg) { alert(message from website: + msg);}
在greetuser.js文件中添加如下代码:
function greetuser() { showmessage(greetings and salutations!);}
注意,greetuser()依赖于showmessage()。
嵌入js文件
相比把js文件发布到站点,我们更乐于把它们嵌入到dll。这样子,如果dll被发布到站点,那么所有js文件也被自动发布。做到一点很简单,我们只需要右键js文件,打开属性页,为“生成操作”选择“嵌入资源”即可,如下:
在确定js文件嵌入dll后,你需要使它们能够被web用户访问。为此,需要为项目javascriptlibrary添加system.web的引用:
然后编辑javascripthelper.cs,添加如下代码:
using system.web.ui;[assembly: webresource(javascriptlibrary.javascript.showmessage.js, application/x-javascript)][assembly: webresource(javascriptlibrary.javascript.greetuser.js, application/x-javascript)]
这样就能保证web用户通过客户端访问嵌入式js文件了。
引用嵌入式js文件
现在你已嵌入了js文件,并能通过客户端电脑访问它们。在使用的时候,你必须在页面上引用它们。为此,需要对javascripthelper类做如下修改:
using system;using system.web.ui;[assembly: webresource(javascriptlibrary.javascript.showmessage.js, application/x-javascript)][assembly: webresource(javascriptlibrary.javascript.greetuser.js, application/x-javascript)]namespace javascriptlibrary{ /// <summary> /// 帮助页面引用嵌入式js文件 /// </summary> public class javascripthelper{ #region 静态字段 private const string name_show_message = javascriptlibrary.javascript.showmessage.js; private const string name_greet_user = javascriptlibrary.javascript.greetuser.js; #endregion #region 公共方法 /// <summary> /// 在页面上引用showmessage.js文件 /// </summary> /// <param name="manager">通过page.clientscript访问</param> public static void include_showmessage(clientscriptmanager manager){ includejavascript(manager, name_show_message); } /// <summary> /// 在页面上引用greetuser.js文件 (包括所有依赖文件) /// </summary> /// <param name="manager">通过page.clientscript访问</param> public static void include_greetuser(clientscriptmanager manager){ //依赖(showmessage.js). include_showmessage(manager); //引用 greetuser.js. includejavascript(manager, name_greet_user); } #endregion #region 私有方法 /// <summary> /// 在页面上引用指定的嵌入式js文件 /// </summary> /// <param name="manager">通过page.clientscript访问</param> /// <param name="resourcename">用于标示嵌入式js文件的名字</param> private static void includejavascript(clientscriptmanager manager, string resourcename){ var type = typeof(javascriptlibrary.javascripthelper); manager.registerclientscriptresource(type, resourcename); } #endregion }}
includejavascript()是关键所在。它通过调用registerclientscriptresource()确保为嵌入式js文件获取一个脚本标签。include_greetuser()调用了includejavascript(),同时也调用了include_showmessage()(用于处理依赖关系)。因此,任何页面在引用greetuser()时也将引用showmessage()。
现在我们有了可用的类,接下在让我们在default.aspx页面中试用它。首先在站点parchmentpurveyor中添加对javascriptlibrary的引用:
接下来我们需要修改引用js页面的后台代码。
using system;using system.web.ui;namespace parchmentpurveyor{&n