我已经在这个问题上摸不着头几个小时了,问题似乎很有趣。我似乎错过了我应该控制的__doPostBack
事件,但事实并非如此。有些人建议添加:
ClientScript.GetPostBackEventReference(this, string.Empty);
然而,虽然它确实创建了我正在寻找的函数定义,但无论我做什么,页面都会在回发事件上重新加载。正如一些人在提到的那样:
这是因为控件ID与/找不到匹配。
我显然做错了考虑到这一点1)回发功能不会在没有暴力强制的情况下渲染2)即使强暴进入,回发也找不到合适的设置。以下是代码片段:
班级定义
[ParseChildren(true)]
[PersistChildren(true)]
[ToolboxData("<{0}:Accordion runat=server></{0}:Accordion>")]
public class Accordion : DataBoundControl, IPostBackEventHandler
活动
public event JQUI_Event ItemClick;
单击handler,RaisePostBackEvent和追加__doPostBack的OnLoad
public void RaisePostBackEvent(string eventArgument)
{
ItemClick(null, null);
}
protected override void OnLoad(EventArgs e)
{
Page.ClientScript.GetPostBackEventReference(this, string.Empty);
base.OnLoad(e);
}
protected virtual void OnClick(EventArgs e)
{
if (ItemClick != null)
{
ItemClick(null, null);
}
}
最后生成回发的代码:
if (ItemClick != null)
{
outPut += "<script> $(function() { $('#" + ClientID + "').find('div').on('click', function() { __doPostBack('" + UniqueID + "', '') }); }); </script>";
}
writer.Write(outPut);
如果您需要更多代码,请与我们联系。我不想只是抛出一长串代码,只是告诉人们弄明白。
编辑:
好的,得到了RaisePostBackEvent(字符串eventArgument)来调用。但是,我遇到的问题是页面仍然决定重新加载。我已经测试过以确保它在正确的控件中调用正确的函数(不仅仅是因为它是一个回发)。有没有办法将此限制为部分回发而不是完整的回发?
答案 0 :(得分:1)
See the GetPostBackEventReference documentation,显示它返回一个字符串,其中包含__doPostBack
方法调用。它不是控件的注册方法。然后使用您的控件呈现此字符串。使用自定义控件时,__doPostBack
不是自动输出。