Javascript ASP.NET服务器控件客户端事件处理
关于具有客户端功能的ASP.NET服务器控件,我有一个问题。我希望改进客户端事件处理:当子客户端控件触发事件时,我希望直接通知父客户端控件 假设我们有两个服务器控件,MyWindow和MyTextBox。两者都是类型为“Sys.UI.Control”的客户端对象 MyTextBox是MyWindow的子项:Javascript ASP.NET服务器控件客户端事件处理,javascript,asp.net-ajax,webforms,Javascript,Asp.net Ajax,Webforms,关于具有客户端功能的ASP.NET服务器控件,我有一个问题。我希望改进客户端事件处理:当子客户端控件触发事件时,我希望直接通知父客户端控件 假设我们有两个服务器控件,MyWindow和MyTextBox。两者都是类型为“Sys.UI.Control”的客户端对象 MyTextBox是MyWindow的子项: public class MyWindow : Control, IScriptControl { private MyTextBox _mtb; //.... prote
public class MyWindow : Control, IScriptControl
{
private MyTextBox _mtb;
//....
protected override void CreateChildControls()
{
_mtb = new MyTextBox();
_mtb.ID = "MTB";
_mtb.OnClientTextChanged = "OnClientTextChanged";
Controls.Add(_mtb);
}
//...
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
ScriptControlDescriptor descriptor = new ScriptControlDescriptor("Test.MyWindow", ClientID);
descriptor.AddComponent("myTextBox", _mtb.ClientID);
yield return descriptor;
}
现在,只要文本框的文本发生更改,就会触发客户机事件并调用函数“OnClientTextChanged”
我想要的是通知客户机对象“MyWindow”。我可以这样做:
function OnClientTextChanged(sender, args) {
$find("MyWindow").textBoxChangedItsText();
}
但是,如果不使用这个全局javascript函数,如何直接通知MyWindow的客户机对象呢?我测试的是
_mtb.OnClientTextChanged = string.Format("($find('{0}')).textBoxChangedItsText", ClientID);
但是我发现客户端对象中的“textBoxChangedItsText”函数无法访问对象本身——“this”是函数本身,但不是使用“$find”(“MyWindow”)可以找到的对象
我希望这个问题对于熟悉支持客户端的AJAX服务器端控件的人来说是清楚的
谢谢
编辑:在客户端使用此事件处理程序:
服务器端:
_mtb.OnClientTextChanged = string.Format(" ($find('{0}')).textBoxChangedItsTextDelegate", ClientID);
客户端:
function OnClientTextChanged(sender, args) {
alert('test')
}
Test.MyWindow = function (element) {
Test.MyWindow.initializeBase(this, [element]);
this.textBoxChangedItsTextDelegate= Function.createDelegate(this, function (sender, e) {
this.textBoxChangedItsText();
});
};
Test.MyWindow.prototype = {
initialize: function () {
Test.MyWindow.callBaseMethod(this, 'initialize');
},
textBoxChangedItsText: function () {
alert(this.get_id());
},
dispose: function () {
Test.MyWindow.callBaseMethod(this, 'dispose');
}
};
我仍然不喜欢的是在事件处理程序中使用$find附加到事件服务器端:_mtb.OnClientTextChanged=string.Format(“($find(“{0}”)).textBoxChangedItsTextDelegate”,ClientID) 我认为您需要定义事件,因为它基本上是在ASP.NET客户端控件中定义的。因此,有必要将以下内容添加到MyTextBox客户端对象原型中:
add_textChanged: function(handler) {
this.get_events().addHandler('shown', handler);
}
remove_TextChanged: function (handler) {
this.get_events().removeHandler('textChanged', handler);
}
raise_textChanged: function (eventArgs) {
var handler = this.get_events().getHandler('textChanged');
if (handler) {
handler(this, eventArgs);
}
}
这将定义客户端事件,客户端代码(父控件或页面)可以订阅该事件并执行所需操作。要在MyTextBox中引发此事件,可以使用如下代码:
this.raise_textChanged(Sys.EventArgs.Empty);
要在MyWindow客户端对象中使用此事件,您需要将代码修改为以下内容:
Test.MyWindow = function (element) {
Test.MyWindow.initializeBase(this, [element]);
this._myTextBoxID = null;
this._onTextChanged$delegate = Function.createDelegate(this, this._onTextChanged);
};
Test.MyWindow.prototype = {
initialize: function () {
Test.MyWindow.callBaseMethod(this, 'initialize');
$find(this._myTextBoxID).add_textChanged(this._onTextChanged$delegate);
},
_onTextChanged: function(sender, eventArgs) {
// Perform required actions.
// this - will be instance of the this client side object.
}
dispose: function () {
$find(this._myTextBoxID).remove_textChanged(this._onTextChanged$delegate);
Test.MyWindow.callBaseMethod(this, 'dispose');
}
};
注意:在提供的示例中,我使用了这个._myTextBox,它等于子myTextBox控件的客户端id。您可以在不执行$find的情况下使用属性“myTextBox”,因为您可以使用descriptor.AddComponent(“myTextBox”,_mtb.ClientID)初始化它 我认为您需要定义事件,因为它基本上是在ASP.NET客户端控件中定义的。因此,有必要将以下内容添加到MyTextBox客户端对象原型中:
add_textChanged: function(handler) {
this.get_events().addHandler('shown', handler);
}
remove_TextChanged: function (handler) {
this.get_events().removeHandler('textChanged', handler);
}
raise_textChanged: function (eventArgs) {
var handler = this.get_events().getHandler('textChanged');
if (handler) {
handler(this, eventArgs);
}
}
这将定义客户端事件,客户端代码(父控件或页面)可以订阅该事件并执行所需操作。要在MyTextBox中引发此事件,可以使用如下代码:
this.raise_textChanged(Sys.EventArgs.Empty);
要在MyWindow客户端对象中使用此事件,您需要将代码修改为以下内容:
Test.MyWindow = function (element) {
Test.MyWindow.initializeBase(this, [element]);
this._myTextBoxID = null;
this._onTextChanged$delegate = Function.createDelegate(this, this._onTextChanged);
};
Test.MyWindow.prototype = {
initialize: function () {
Test.MyWindow.callBaseMethod(this, 'initialize');
$find(this._myTextBoxID).add_textChanged(this._onTextChanged$delegate);
},
_onTextChanged: function(sender, eventArgs) {
// Perform required actions.
// this - will be instance of the this client side object.
}
dispose: function () {
$find(this._myTextBoxID).remove_textChanged(this._onTextChanged$delegate);
Test.MyWindow.callBaseMethod(this, 'dispose');
}
};
注意:在提供的示例中,我使用了这个._myTextBox,它等于子myTextBox控件的客户端id。您可以在不执行$find的情况下使用属性“myTextBox”,因为您可以使用descriptor.AddComponent(“myTextBox”,_mtb.ClientID)初始化它 关于MyTextBox的事件处理程序的事情很清楚,我只是没有发布这篇文章,因为我认为这是显而易见的。但是附加到事件客户端是一个非常好的主意,我还没有想到。也许有人对如何从服务器端(如我的示例中)更优雅地附加有另一个想法。MyTextBox的事件处理程序很清楚,我只是没有发布这篇文章,因为我认为这是显而易见的。但是附加到事件客户端是一个非常好的主意,我还没有想到。也许有人有另一个想法,如何从服务器端(如我的示例中)更优雅地连接。