在 ASP.NET 里面,服务器端动态生成 JavaScript 的方式是灵活多样的,包括生产页面内脚本块和外部文件,本文讨论了4种可行的方案。
文章目录 先用Page.ClentScript.IsClientScriptBlockRegistered()判断脚本是否已经注册,若未注册,则调用 Page.ClientScript.RegisterClicentScriptBlock,具体可以看这篇文章。至于 ASP.NET AJAX,ScriptManager 类有另外一套注册客户端脚本的方法。
那就在程序启动的时候 string path = Server.MapPath( " ../js/xyz.js " ); // Delete the file if it exists. if (File.Exists(path)){ File.Delete(path);} // Create the file. StreamWriter sr = File.CreateText(path);sr.WriteLine ( " function f1() " );sr.WriteLine ( " { " ); // 这里是f1的内容 // …… sr.WriteLine ( " } " );sr.Close();
在 Page_Load 事件里面输出 JavaScript 脚本流,然后用 Response.End() 方法将当前所有缓冲的输出发送到客户端,停止该页的执行,因为标签是在Page Render 事件呈现的,Page Load 事件先于 Page Render 执行,执行到Response.End() ,结束该页的输出,Page Reader 的内容就不再输出了,则后面的<html><head><body> 之类的标签就不会输出。
Protected Sub Page_Load( ByVal sender As Object , ByVal e As System.EventArgs) Handles Me .Load Response.ContentType = " text/javascript " Response.Write( " var External = {}; " & vbCrLf) Response.Write( " External.hello='Hello, This is external JavaScript output in Page_Load event and end by Response.End() method !'; " ) Response.End() End Sub 在解决方案资源管理器里面“添加新项”,选择“一般处理程序”,点添加后生成一个 ashx 后缀名的文件。该文件类继承 IHttpHandler 接口,定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。它只公开了两个成员
IsReusable: 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。如果 IHttpHandler 实例可再次使用,则为 true;否则为 false。将 IsReusable 属性用所提供的重写 IsReusable 属性访问器 (getter) 的代码显式设置为 true 或 false。
ProcessRequest: 这个输出数据流的关键方法,它通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。 用context.Response.Write() 向客户端输出数据。
< %@ WebHandler Language = " VB " Class = " OutsiteJS " % > Imports System Imports System.Web Public Class OutsiteJS : Implements IHttpHandler Public Sub ProcessRequest( ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest context.Response.ContentType = " text/plain " context.Response.Write( " var Outsite = {}; " ) context.Response.Write( " Outsite.greeting = 'Hello! This is outsite javascript created by ashx file(一般处理程序)'; " ) End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class
生成的客户端代码
var External = {}; External.hello = ' Hello, This is external JavaScript output in Page_Load event and end by Response.End() method ! '
调用方式其实跟通常的调用外部 Javascript 差不多,只是<script> 标签加上 type="text/javascript" 属性,以免识别不了文件类型, src 属性设置为动态文件的文件名,如"makeJS.aspx" 而不是通常的“filename.js”。
< script type ="text/javascript" src ="makeJS.aspx" ></ script > < script type ="text/javascript" src ="OutsiteJS.ashx" ></ script > < script type ="text/javascript" > alert(External.hello) alert(Outsite.greeting) </ script >