在深入研究了扩展控件和JavaScript之后,我拼凑出了一个看起来目前运行良好的解决方案。
主要的技巧是将必要的PostBack代码从服务器端传递到客户端行为脚本。我通过使用ExtenderControlProperty
(在控件的OnPreRender
函数中设置),然后在行为脚本中进行评估来实现这一点。其余部分是基本的事件处理。
因此,现在我的扩展控件的.cs
文件大致如下:
public class DelayedSubmitExtender : ExtenderControlBase, IPostBackEventHandler
{
protected override void OnPreRender(EventArgs e)
{
string postback = Page.ClientScript.GetPostBackEventReference(this, "DelayedSubmit") + ";";
PostBackEvent = postback;
}
[ExtenderControlProperty]
public string PostBackEvent
{
get
{
return GetPropertyValue<string>("PostBackEvent", "");
}
set
{
SetPropertyValue<string>("PostBackEvent", value);
}
}
public event EventHandler Submit;
protected void OnSubmit(EventArgs e)
{
if (Submit != null)
{
Submit(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)
{
if (eventArgument == "DelayedSubmit")
{
OnSubmit(new EventArgs());
}
}
}
我的行为脚本大致如下:
DelayedSubmitBehavior = function(element) {
DelayedSubmitBehavior.initializeBase(this, [element]);
this._postBackEvent = null;
}
DelayedSubmitBehavior.prototype = {
get_PostBackEvent: function() {
return this._postBackEvent;
},
set_PostBackEvent: function(value) {
this._postBackEvent = value;
}
_onTimerTick: function(sender, eventArgs) {
eval(this._postBackEvent);
}
}
现在,服务器端的事件可以像处理其他控件上的事件一样进行处理。