以資源調用的方式發送客戶端腳本方法研究成功,源碼發布!


這幾天我一直在研究自定義服務器控件,建立自己的服務器控件就要牽涉到發送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 个解决方案

#1


搶一樓

#2


實際上,應該這樣做:

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);
}

#3


正在學習....

#4


笑兄,大作啊!

#5


get..from..resource
:)

#6


結貼

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com