C# 回发时用户控件事件处理程序丢失

C# 回发时用户控件事件处理程序丢失,c#,asp.net,postback,user-controls,webforms,C#,Asp.net,Postback,User Controls,Webforms,我有一个名为LeftMenu的菜单用户控件,它有一个链接项的bulletedlist。它位于ascx页面上,如下所示: <asp:BulletedList ID="PublisherList" DisplayMode="LinkButton" OnClick="PublisherList_Click" cssClass="Menu" runat="server"></asp:BulletedList> 知道我在哪里丢失了事件处理程序吗 我刚刚意识到这也发生在我的另一个用

我有一个名为LeftMenu的菜单用户控件,它有一个链接项的bulletedlist。它位于ascx页面上,如下所示:

<asp:BulletedList ID="PublisherList" DisplayMode="LinkButton" OnClick="PublisherList_Click" cssClass="Menu" runat="server"></asp:BulletedList>
知道我在哪里丢失了事件处理程序吗

我刚刚意识到这也发生在我的另一个用户控件上。一个文本框和一个按钮,我使用默认按钮来确保按enter键使用该按钮。Net将html中的转换为:

 <div id="SearchBarInclude_SearchBar" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'SearchBarInclude_QuickSearchButton')">

因此,当我在框中输入一个键时,我在“objectexpected”行中得到一个javascript错误。看起来这两个问题是相关的


再次编辑:我想我需要澄清一下。并不是我点击了菜单项,它在回发时找不到所选的项目。我有一个左侧导航的搜索页面,然后页面的主要内容会导致回发。这封回信一切都很好。一旦该页面被发回,现在如果我点击左侧导航中的项目符号列表,我会得到一个javascript错误,并且失败。LeftMenu控件的page_init从未被调用。

听起来您可能会失去单击,因为您没有在回发时对列表进行数据绑定。因此,回发邮件试图引用不存在的控件(特定项目符号列表项)


您应该在回发时再次尝试绑定列表,看看这是否解决了您的问题。但是真正应该做的是,LeftMenu和BulletedList应该将它们的信息存储到ViewState中,这样您就可以确保在初始页面加载时向用户显示的数据与回发正在处理和使用的数据相同。

如果您的UserControl和所有控件都启用了EnableViewState=true在它里面,一切都应该运转良好。启用ViewState后,ASP将在启动Init后从ViewState重新展开控件。这意味着回发事件arg(指向控件列表中的索引)仍将在该列表位置找到该控件。否则,回发时列表为空

然而,ViewState是魔鬼的作品,它的设计仅仅是为了培养一种错觉,即您在一个有状态的环境中工作。可以将其用于少量数据,但通常不建议用于模板化控件(如中继器和列表),因为您不知道在ViewState中将创建多少数据

如果您处理的是静态或相对静态的数据,请将其存储在应用程序缓存中,并每次在Page.Init中重新绑定列表(请注意,它必须在Init中,因为当ASP从ViewState重新绑定时,才是post Init;如果您先进入,则将使用您的数据)

如果处理的是易失性数据,则会出现问题,因为重新绑定的数据必须与原始页面请求完全相同,否则回发事件将针对错误的行触发。在这种情况下,您需要将初始数据存储在会话中,或者只存储行ID列表(在隐藏变量或会话中),然后每次重新创建要根据ID绑定的数据

更好的解决方案是根本不使用回发事件。尝试将所有事件转换为在查询字符串上具有ID的get。您仍然可以在第一次通过页面使用绑定创建列表(正如您当前所做的),甚至可以使用新ID获得相同的页面

如果需要将状态保持在同一页面上,但需要响应用户更改单选按钮选择(或其他内容),请考虑使用Ajax调用来更新屏幕。您还可以使用传递给Ajax调用的ID来实现这一点

一般来说,使用有状态ASP的用户越多,页面就会变得越轻巧,响应能力也就越强。如果有必要,您也可以更好地转向无状态MVC。由于ViewState在需要时不可用,因此您还可以节省调试模糊问题所损失的大量时间

我读过的对ViewState最好的分析在下面的链接中。如果您完全了解它的工作原理,您可以继续使用它,而不必承担成本


这可能与javascript有关,并且在页面前面加载的脚本抛出错误,导致页面无法正确加载


您的用户控件是否正在将任何javascript加载到页面上?您能检查页面初始加载时的javascript错误吗?

我将代码移动到现有的项目中,出于某种奇怪的原因,我停止了获取javascript错误,取而代之的是:

“回发或回调参数无效。使用配置中的
或页面中的
启用事件验证

出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合要求,请使用
ClientScriptManager.RegisterForEventValidation
方法注册回发或回调数据以进行验证。”


我还没有完全弄清楚应该将注册事件验证与用户控件放在哪里,但与此同时,我刚刚设置了
enableeventvalidation=false
,它现在似乎可以工作了。

doPostBack函数似乎丢失了,因为它的参数是文本,所以它们不可能是原因。这是您自己的函数之一,还是您想调用ASP\uu doPostBack函数


查看Firefox错误控制台或IE中的allow脚本调试,看看到底是什么对象找不到。更好的是,下载Firebug并调试它。

我也遇到了类似的问题。事实证明,Akamai之所以修改用户代理字符串,是因为应用了一个不需要的设置

这意味着一些.NET控件没有正确地呈现doPostBack代码。本期已在博客上发布。

W
 <div id="SearchBarInclude_SearchBar" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'SearchBarInclude_QuickSearchButton')">