我有一个关于具有客户端功能的 ASP.NET 服务器控件的问题。我想改进客户端事件处理:当子客户端控件触发事件时,我希望直接通知父客户端控件。
假设我们有两个服务器控件,MyWindow 和 MyTextBox。两者都是“Sys.UI.Control”类型的客户端对象。
MyTextBox 是 MyWindow 的子项:
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;
}
客户端:
function OnClientTextChanged(sender, args) {
alert('test')
}
现在,每当文本框的文本发生变化时,都会触发客户端事件并调用函数“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);
客户端:
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 );