一.預呈現數據無法更改
1.大家知道,預呈現的數據是無法更改的,以前可能提到過,這里再看demo,自定義一個控件
[DefaultProperty("Text")]
[ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")]
public class JsControl : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void OnPreRender(EventArgs e)
{
Text = "hello,you can't change me";
base.OnPreRender(e);
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
aspx頁面
protected void Button1_Click(object sender, EventArgs e)
{
JsControl1.Text = "I want to change the Text property";
}
你會發現你并未更改屬性.這牽涉到控件生命周期的執行.為什么要說這個,因為控件的大部分腳本都是在預呈現中注冊的.
這有什么問題嗎? 其本身想法很好,腳本在此事件(指OnPreRender)中注冊,注冊腳本資源在前(控件夾中間),腳本初始化在最后.這符合javascript的使用原則,先導入腳本,然后有標簽,初始化的腳本須放在標簽后面.
二.UpdatePanel引起的問題
上面的問題如果是服務器提交回傳的則可行,主要問題是我們要用ajax無刷新注冊腳本.以下我們再來看asp.net2.0內置的treeview控件,拖個控件要頁面看其生成的html代碼。
你已經看到很多的腳本注冊和初始化了.
我們來測試下UpdatePanel能干什么事情,我們設置其屬性Visible為False到True
借助FireBug的威力我們來看下UpdatePanel在無刷新狀態下返回給了我們什么
出錯了,大家可能也遇到過此情況,很正常嘛,UpdatePanel沒有為我們注冊腳本也沒未我們初始化,在屬于正常現象,UpdatePanel只管其容器里面的,其他的不歸它管.
三.解決方法
要解決TreeView控件,我是想不出來,這個控件算是在asp.net ajax模式下算是完蛋了.為了迎合asp.net ajax框架的運用,我們需要知道UpdatePanel無刷新更新范圍,當我們自己定義控件的時候就需要注意.
1.控件本身標簽
2.控件內部
3.UpdatePanel容器內部
若想使用UpdatePanel更新數據后再觸發客戶端事件的,有以下方案
1.通過更改現有控件屬性,如
Button1.Attributes["onmouseover"] = "alert('hello')";
2.在呈現過程中腳本初始化
第一種方法簡單運用還可以,復雜就不行了,我們還是需要把腳本封裝好跟控件結合使用的,我們不再在預呈現中注冊腳本,而在呈現中實現(即RederContent方法).
我們只要保證腳本資源在前,初始化在后,控件在中間這一原則就可以了...以下方法是可行的
如下
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<script src=\"xxxx.js\"></script>");
output.Write(Text);
output.Write("<script>alert('hello')</script>");
}
四.幾個誤區
1.驗證控件在ajax框架中可以完好使用
其實是其加載了一段腳本,不然其也會掛掉
2.狀態保留
在UpdatePanel中更新數據后,再Postback,無刷新更新的數據狀態還保留
3.更新數據后執行客戶端腳本
曾經我們天真的會這么寫
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "alert('hello')";
}
結果什么也沒發生,window.onload事件已過,除非你刷新(可你不想刷新),不然沒人幫你觸發。
誰來觸發?微軟幫我們準備好了。你要的大概就是這個了,數據更新前后都是一個事件觸發。我們可以圍繞著這兩個事件為控件做點事情。這個狀態適合于數據取到后就立馬觸發的需要。
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function BeginRequestHandler(sender, args)
{
var elem = args.get_postBackElement();
ActivateAlertDiv('visible', 'AlertDiv', elem.value + ' processing');
}
function EndRequestHandler(sender, args)
{
ActivateAlertDiv('hidden', 'AlertDiv', '');
}
function ActivateAlertDiv(visstring, elem, msg)
{
var adiv = $get(elem);
adiv.style.visibility = visstring;
adiv.innerHTML = msg;
}
其他的話我們也可以更改控件屬性,就如加個onclick事件什么的都可以
五.另類解決方法
此方法比較的絕,但用起來比較的爽。UpdatePanel之所以無法獲取到腳本數據,是因為其獲取范圍還不夠。。。接著的想法是:
照樣無刷新取數據,但取回來的數據跟Postback回來的數據一樣。
可能有人說會比較耗性能,那都是相對的。不過也是一個很好的想法。Telerik公司的RadAjaxPanel就是這么實現的,有興趣的可以下載一個用用 .
UpdatePanel觸發javascript腳本的方法附代碼
2019-10-08 09:42asp代碼網 ASP教程
一.預呈現數據無法更改 1.大家知道,預呈現的數據是無法更改的,以前可能提到過,這里再看demo,自定義一個控件 [DefaultProperty("Text")] [ToolboxData("<{0}:JsControl runat=server></{0}:JsControl>")] public class JsControl : WebControl {
延伸 · 閱讀
- 2022-03-03詳解CocosCreator系統事件是怎么產生及觸發的
- 2021-12-15Asp.net中UpdatePanel的用法詳解
- 2021-12-07TreeNodeCheckChanged事件觸發方法代碼實例
- 2021-11-17詳解vue中在父組件點擊按鈕觸發子組件的事件
- 2021-11-17談論Go 什么時候會觸發 GC問題
- 2021-11-08淺談vue.watch的觸發條件是什么
- ASP教程
asp+javascript實現404頁的處理轉換
asp+javascript實現404頁的處理轉換...
- ASP教程
asp 采集實戰代碼
最近實在是太流行采集了,本人是不喜歡采集的,但對采集的原理我卻很有興趣進行研究,拿到了網上采集常用函數,對其進行了一番研究,并實戰,結果...
- ASP教程
asp Access數據備份,還原,壓縮類代碼
asp Access數據備份,還原,壓縮類實現代碼,大家可以參考下。...
- ASP教程
asp之基于adodb.stream的文件操作類
asp之基于adodb.stream的文件操作類...
- ASP教程
ASP.NET 數據源
數據源 一個 data sourse 控件與數據綁定的控件相互作用,并隱藏了復雜的數據的聯編過程。這些是提供數據給 data bound 控件的工具,并且支持如插入,刪除...
- ASP教程
asp 標記字符串中指定字符變色不區分大小寫
今天遇到這種問題,單純的使用replace函數不行,他會改變原有的字符串的大小寫,在網上找到相關的代碼,自己備份下...
- ASP教程
ASP常用函數:getpy()
ASP常用函數:getpy()...
- ASP教程
JScript中遍歷Request表單參數集合的方法
這篇文章主要介紹了JScript中遍歷Request表單參數集合的方法,本文以遍歷Request.QueryString集合為例給出了實現代碼,需要的朋友可以參考下...