クライアント機能を備えたASP.NETサーバーコントロールについて質問があります。クライアント側のイベント処理を改善したい:子クライアントコントロールがイベントを発生させたときに、親クライアントコントロールに直接通知されるようにしたい。
MyWindowとMyTextBoxの2つのサーバーコントロールがあると仮定します。どちらも「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')
}
これで、テキストボックスのテキストが変更されるたびに、client-eventが発生し、関数「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 );