用户控件的事件处理程序失去了回传(user control event handler lost o

2019-09-23 01:00发布

我有一个名为LeftMenu菜单用户控件有linkitems的BulletedList中。 这是ASCX页这样的:

<asp:BulletedList ID="PublisherList" DisplayMode="LinkButton" OnClick="PublisherList_Click" cssClass="Menu" runat="server"></asp:BulletedList>

我数据绑定列表在Page_Load下if(!isPostBack)

我有一个加载控制页面上的问题。 当第一次加载页面时,事件处理火灾。 然而,当页面回它不再火灾和IE8中,当我调试,我得到“Microsoft JScript运行时错误:对象预期”在Visual Studio中的“指向__doPostBack(‘LeftMenu $ PublisherList’,‘0’) “。 在FF我没有得到的错误,但没有任何反应。 我不是动态加载的控制,它的加载使用aspx页面上:

<%@ Register TagPrefix="Standards" TagName="LeftMenu" Src="LeftMenu.ascx" %>

<Standards:LeftMenu ID="LeftMenu" runat="server"/>

在那里我失去了事件处理程序的任何想法?

我才意识到这是另一个用户控件我也一样发生。 一个文本框和一个按钮,我使用的是默认的按钮,以确保按回车键使用该按钮。 净转换,在HTML中:

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

所以,只要我在框中输入一个关键我在该行称得到一个JavaScript错误“对象的预期。” 这似乎是两个问题是相关的。

再次编辑:我想我需要澄清。 这并不是说我点击菜单项,它无法找到回传所选择的项目。 我与它的左侧导航这个搜索页面,然后在页面的主要内容是什么,导致回发。 一切都很好,与此回发。 一旦页面已经被贴后背,如果我现在点击项目符号列表在左侧导航我得到一个JavaScript错误和失败。 对于LeftMenu控制的page_init永远不会被调用。

Answer 1:

这听起来像你可能会失去的点击,因为你没有绑定在回发名单。 因此,后回正试图指的是不存在的控制(具体项目符号列表项)。

你应该再试一次结合在回发名单只是为了看看是否能解决您的问题。 但是,什么应该真正发生的是,LeftMenu和的BulletedList应该将其信息保存到ViewState中,这样就可以保证这是证明他们的初始页面加载用户的数据是,回发处理,并与工作同样的数据。



Answer 2:

如果你的EnableViewState =真为你的用户控件以及其中的所有控件,一切都应该正常工作。 启用ViewState中,ASP将初始化已触发后reinflate从ViewState中的控件。 这意味着回发事件ARG(它指向你的控制列表的指数)仍然会发现在该列表中位置的控制。 否则,该列表是在回发空。

然而,ViewState的是魔鬼的工作,目的仅仅是为了培养你是一个有状态的环境中工作的假象。 因为你不知道多少数据要在ViewState中要创建它是好的用它来少量的数据,但通常不建议对像中继器和列表模板控件。

如果你正在处理静态的,或者相对静态的数据,其存储在应用程序缓存,并重新绑定在Page.Init您列出每个时间(注意,必须是在初始化因为-初始化后当ASP从ViewState中重新绑定;如果你在那里得到的第一个,你的数据将被用来代替)。

如果你正在处理可变数据,你有一个问题,因为你重新绑定的数据必须是完全一样的原始页面请求,否则回发事件将被解雇防错行。 在这种情况下,你需要或者存储在会话你的初始数据,或者你只是存储行ID列表(在一个隐藏的变量或会议),并重新创建数据绑定对来自IDS各一次。

一个更好的解决办法是在所有不使用回发事件。 尽量把所有的事件,将获取对查询字符串的ID。 你仍然可以创建一个使用过的页面绑定在第一时间(如你正在做)的列表中,你甚至可以用一个新的ID在同一页。

如果你需要保持状态,在同一页上,但需要用户改变一个单选按钮选择(或别的东西)作出回应,考虑使用Ajax调用来更新屏幕。 你也做到这一点与您传递给Ajax调用的ID。

在一般情况下,你越使用状态ASP动,更轻,响应更您的网页将成为。 你也将是一个更好的位置移动在必要时对无国籍MVC。 您还可以节省大量的时间失去了调试晦涩的问题,因为当你需要它的ViewState不可用。

我读过的ViewState的最好的分析是下面的链接。 如果你完全了解它是如何工作的,你可以继续使用它,而不必承担费用。

http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx



Answer 3:

这是可能的,这可能是相关的JavaScript,而对于加载此前在页面抛出一​​个错误,导致网页脚本无法正确加载。

是你的用户控件加载任何JavaScript到页面上? 你可以检查在页面初始加载JavaScript错误?



Answer 4:

我感动的代码到现有的项目中,我们已经和一些奇怪的原因,我停下得到的JavaScript错误,而是有:

“无效的回发或回调参数。事件验证使用启用<pages enableEventValidation="true"/>在配置或<%@ Page EnableEventValidation="true" %>中的页面。

为了安全起见,此功能验证参数回发或回调事件,从最初呈现这些事件的服务器控件。 如果数据是有效的和预期,使用ClientScriptManager.RegisterForEventValidation方法,以注册回发或回调数据以进行验证“。

我还没有完全想通了,在那里我应该把寄存器事件验证与用户的控制,但在平均时间我只设置enableeventvalidation=false ,似乎现在的工作。



Answer 5:

它看起来像doPostBack功能缺失,因为它的参数是文字,因此他们不可能是原因。 那是你自己的功能之一,还是你的意思是调用ASP __doPostBack功能?

看看Firefox的错误控制台或允许在IE脚本调试,准确地看,不能找到什么对象。 更妙的是,下载萤火虫和调试。



Answer 6:

我有一个类似的问题。 原来,Akamai的被修改的用户代理字符串,因为正被施加的设置,并不需要。

这意味着,一些.NET控件没有正确呈现__doPostBack代码。 这个问题一直热议在这里 。



文章来源: user control event handler lost on postback