這幾天我一直在研究自定義服務器控件,建立自己的服務器控件就要牽涉到發送js客戶端腳本代碼。說實話,以前我不知道怎樣發送,就發了一個帖子,問怎樣發送js代碼,大家可以看看:
http://expert.csdn.net/Expert/topic/1440/1440118.xml?temp=.4021875
帖子里面給出的方法就是使用HtmlTextWriter對象和Page.RegisterClientScriptBlock()方法手工硬編碼js腳本。
大家可以到:
http://www.sanxingtest.com/newsite
看看,我做的AspNetMenu組件的使用,打開html代碼,看看這個組件發送的js腳本代碼。如果用上面貼子的手工硬編碼的方法,大家說是否可行?我覺得肯定非常非常麻煩,所以我就希望使用一次性的方法,事先編寫好一個js文件,然后用程序調用。
現在此程序調試成功,發布源代碼,包括C#代碼和VB.Net代碼。
一、測試環境
我是在一個自定義服務器控件項目里面進行測試的,但是這個方法可以在Web項目里面測試,因為方式都是一樣的。此方法應該在Vs.Net下進行,因為我不知道怎樣用命令行方式加入資源。
二、示例js代碼
使用這個功能,當然需要一個測試用的js代碼,此代碼大家可以隨便寫,我用的js代碼如下:
<script language="javascript" type="text/javascript">
<!--
function SX_WinClose()
{
window.opener=Null;
window.close();
}
//-->
</script>
在Vs.Net中加入一個js文件,文件名隨便取,假設為“script1.js”,然后把上面的代碼拷貝到這個文件里面,然后Ctrl+S保存
然后(重要),打開“解決方案資源管理器”窗口,選擇這個文件,單擊鼠標右鍵,選擇“屬性”,屬性窗口打開,在“生成操作”項中選擇下拉菜單為“嵌入的資源”
好,編譯后這個文件就會打包到最終生成的dll程序集里面了。
三、發送此腳本到客戶端
js文件既然已經打包到程序集里面,我們就必須使用它,否則一點用沒有
下面是代碼,Web測試可以放在Page_Load里面,我是放在OnPreRender里面
C#用的人多,先寫C#吧
//-----------------------------------------------------
首先必須添加兩個名稱空間引用:
using System.IO;
using System.Reflection; //這個空間是使用Assembly類的
protected overrides void OnPreRender(EventArgs e)
{
string clientscript; //定義放js的變量
//定義引用此程序集
//GetExecutingAssembly()方法作用是
//獲取當前代碼正從中運行的 Assembly。
Assembly asm = Assembly.GetExecutingAssembly();
//下面的代碼定義了一個字符串變量
//定義的上面介紹的js文件名
//注意,必須加上你的此文件使用的名稱空間!!
string resource="Sanxing.WebControl.script1.js"
//開始從使用的程序集加載使用的資源,key就是上面定義的string
//資源加載到流中
Stream stm = asm.GetManifestResourceStream(resource);
//下面的代碼很簡單,從流中讀取內容,放到上面定義的變量里面
StreamReader reader = new StreamReader(stm);
clientscript = reader.ReadToEnd();
reader.Close();
stm.Close();
//好,現在這個js已經放到string里面了,我們把它發送到客戶端
//使用Page.RegisterClientScriptBlock()方法,
//web方式測試可以直接使用
if (!Page.RegisterClientScriptBlock("clientscripttest"))
Page.RegisterClientScriptBlock("clientscripttest",clientscript);
//下面的代碼不是發送js的,web測試不需要
base.OnPreRender(e);
}
//----------------------------------------------
VB.Net
'-----------------------------------------------
Protected Overrides Sub OnPreRender(e As EventArgs)
Dim asm As [Assembly] = [Assembly].GetExecutingAssembly()
If Not (asm Is Nothing) Then
Dim resource As String = ("Sanxing.WebControl.CheckInput.js")
Dim stm As Stream = asm.GetManifestResourceStream(resource)
Dim reader As New StreamReader(stm)
clientscript = reader.ReadToEnd()
reader.Close()
stm.Close()
End If
If Not (Page.RegisterClientScriptBlock("clientscripttest")) Then
Me.Page.RegisterClientScriptBlock("clientscripttest",clientscript)
End If
MyBase.OnPreRender(e)
End Sub
'-----------------------------------------------
四、其它
以上代碼在vs.Net中文版,Asp.Net1.0版,Win2kServer版,IE6下測試成功
這個辦法除了發送客戶端js文件外,還可以發送jpg、gif等圖片文件
原理是一樣的,我正在研究。
6 个解决方案
實際上,應該這樣做:
private string _msb;
public static string MyScriptBlock
{
get
{
if(_mcb==null)
{
_mcb=get..from..resource;
}
return _mcb;
}
}
protected override void OnPreRender(EventArgs e)
{
Page.RegisterClientScriptBlock("xxx",MyScriptBlock);
}