当前位置: 首页 > 编程语言 > C#

用户控件事件处理程序在回发时丢失分享

时间:2023-04-11 03:31:40 C#

C#学习教程:用户控件事件处理程序在回发时丢失它在ascx页面上:我在if(!isPostBack)下对page_load中的列表进行数据绑定我在使用控件加载页面时遇到问题。事件处理程序将在页面首次加载时触发。但是,当页面回发时它不再触发,在IE8中,当我调试时,我得到“MicrosoftJScript运行时错误:预期对象”指向“__doPostBack('LeftMenu$PublisherList','0')”。在FF中我没有得到错误,但什么也没有发生。我没有动态加载控件,它使用以下方法加载到aspx页面:关于我在哪里丢失事件处理程序的任何想法?我刚刚意识到这也发生在我拥有的另一个用户控件上。一个文本框和一个按钮,我使用默认按钮来确保按下回车键使用按钮。.Net将html中的内容转换为:因此,当我在框中输入一个键时,我在“Expectedobject”行出现javascript错误。似乎这两个问题是相关的。再次编辑:我想我需要澄清一下。不是我点击菜单项,它在回传上找不到选中的项目。我有这个搜索页面,左导航,然后页面的主要内容是导致回发的原因。此回发一切正常。一旦该页面被回发,现在如果我单击左侧导航栏中的项目符号列表,我会收到一个javascript错误,但它会失败。永远不会调用LeftMenu控件的page_init。听起来您可能会失去点击率,因为您不是PostBack上的DataBinding列表。因此,回发试图引用不存在的控件(特定项目符号列表项)。您应该尝试在PostBack上再次绑定列表,看看是否能解决您的问题。然而,真正应该发生的是LeftMenu和BulletedList应该将它们的信息存储到ViewState中,以便您可以确保在初始页面加载时显示给用户的数据与PostBack正在处理和使用的数据相同。.如果您的UserControl及其中的所有控件都具有EnableViewState=true那么一切都应该可以正常工作。启用ViewState后,ASP将在Init触发后从ViewState重新填充控件。这意味着回发事件arg(指向控件列表的索引)仍会在该列表位置找到控件。否则列表在回发时为空。然而,ViewState是魔鬼的杰作,它的目的只是营造一种错觉,即您正在一个有状态的环境中工作。您可以将它用于少量数据,但通常不适用于像转发器和列表这样的模板化控件,因为您不知道将在ViewState中创建多少数据。如果您正在处理静态或相对静态的数据,请将其存储在应用程序缓存中,并在每次在Page中重新绑定您的列表。绑定时;如果您先进入,您的数据将被使用)。如果您正在处理易变数据,就会出现问题,因为回弹数据必须与原始页面请求完全相同,否则回发事件将针对错误的行触发。在这种情况下,您需要将初始数据存储在会话中,或者只存储行ID列表(在隐藏变量或会话中)并每次重新创建要绑定到ID的数据。更好的解决方案是根本不使用回发事件。尝试将所有事件转换为查询字符串上带有ID的GET。您仍然可以使用绑定在第一次浏览页面时创建列表(就像您目前所做的那样),甚至可以使用新ID获取同一页面。如果您需要在同一页面上维护状态,但需要响应用户更改单选按钮选择(或其他内容),请考虑使用Ajax调用来更新屏幕。您还可以使用传递给Ajax调用的ID。通常,您使用有状态ASP的次数越多,您的网页就会越轻巧且响应速度更快。如有必要,您最好还是转向无状态MVC。您还可以节省大量调试模糊问题的时间,因为ViewState在您需要时不可用。我读过的对ViewState的最佳分析在下面的链接中。如果您完全了解它的工作原理,您可以继续使用它而不会产生任何费用。http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx这可能与javascript相关,页面中较早加载的脚本会抛出错误并导致页面不正确加载。您的用户控件是否在页面上加载了任何javascript?您可以在页面初始加载时检查javascript错误吗?我将代码移到了我们现有的项目中,出于某种奇怪的原因,我不再收到javascript错误,而是收到:“无效的回发或回调参数。在配置中使用或启用事件验证。出于安全原因,此函数验证参数“回发或回调事件的一部分来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。”我还没有想出我应该把注册事件验证用户控件放在哪里,但与此同时我只是设置了enableeventvalidation=false,它现在似乎可以工作了。似乎缺少doPostBack函数,因为它的参数是文字,所以它们不是原因。这是您自己的函数还是您的意思是调用ASP__doPostBack函数?查看Firefox错误控制台或允许在IE中进行脚本调试,并准确查看无法找到哪些对象。更好的是,下载Firebug并调试它。我有一个类似的问题。事实证明,Akamai正在修改用户代理字符串,因为应用了不需要的设置。这意味着某些.NET控件无法正确呈现__doPostBack代码。这个问题已发布在这里。以上是C#学习教程:用户控件事件处理程序在回发时丢失所有共享的内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: