gpt4 book ai didi

javascript - ASP.NET Server Control 客户端事件处理

转载 作者:行者123 更新时间:2023-11-28 02:36:32 24 4
gpt4 key购买 nike

我有一个关于具有客户端功能的 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 “,客户端ID);

最佳答案

我认为您需要定义事件,就像在 ASP.NET 客户端控件中基本上完成的那样。因此,有必要将以下内容添加到您的 MyTextBox 客户端对象原型(prototype)中:

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

注意:在提供的示例中,我使用了 this._myTextBox,它等于子 MyTextBox 控件的客户端 ID。您可以使用属性“myTextBox”而不执行$find,因为您使用descriptor.AddComponent(“myTextBox”,_mtb.ClientID);初始化它。

关于javascript - ASP.NET Server Control 客户端事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com