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

如何检查动态链接按钮引起的回发分享

时间:2023-04-10 20:35:28 C#

如何检查动态链接按钮引起的回发我有一个按钮控件。单击此按钮时,我需要动态添加链接按钮。链接按钮需要一个事件处理程序。所以动态链接按钮首先在Page_Load中添加,然后在按钮单击处理程序中清除并再次添加。请阅读使用DynamicControl的事件处理程序以了解此操作的业务需求。我已阅读Onbackback,如何检查哪个控件导致了Page_Init事件中的回发,以确定导致回发的控件(在Page_Load内)。但它不适合我的情况。需要更改什么以确认回发是由链接按钮(在Page_Load内)引起的?注:不可避免的情况见下面https://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application注1:if(Page.IsPostBack)iNeedtopostbackcontrolid作为进入的第一步。只有当它是从按钮或链接按钮回发时,我才需要添加动态链接按钮控件。将有其他控件导致回发。对于这样的回发,我们不应该执行这段代码。注2:我在Page_Load中得到Request["__EVENTARGUMENT"]空字符串相关问题:在什么情况下,动态控件将在页面中可用(用于FindControl)。@Tung说-“您的GetPostBackControlId方法正确地获取了导致回发的控件的名称,但它无法通过page.FindControl找到具有该ID的控件,因为尚未创建链接按钮,因此页面不会知道它的存在。“ASPX代码背面publicpartialclassPostbackTest:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){if(Page.IsPostBack){stringIDValue=GetPostBackControlId(this.Page);整数x=0;holder.Controls.Clear();LinkBut??tonlnkDynamic=newLinkBut??ton();lnkDynamic.Click+=newEventHandler(LinkClick);lnkDynamic.ID="lnkDynamic123";lnkDynamic.Text="lnkDynamic123";holder.Controls.Add(lnkDynamic);}}protectedvoidTestClick(objectsender,EventArgse){holder.Controls.Clear();LinkBut??tonlnkDynamic=newLinkBut??ton();lnkDynamic.Click+=newEventHandler(LinkClick);lnkDynamic.ID="lnkDynamic123";lnkDynamic.Text="lnkDynamic123";holder.Controls.Add(lnkDynamic);}protectedvoidLinkClick(objectsender,EventArgse){}publicstaticstringGetPostBackControlId(Pagepage){if(!page.IsPostBack){returnstring.Empty;}控制控制=空;//首先检查“__EVENTTARGET”中是否有带有“_doPostBa”的控件ck"functionstringcontrolName=page.Request.Params["__EVENTTARGET"];if(!String.IsNullOrEmpty(controlName)){control=page.FindControl(controlName);}else{//如果__EVENTTARGET为空,则控件为abuttontypestringcontrolId;ControlfoundControl;foreach(stringctlinpage.Request.Form){//处理ImageButton它们在其Id中有一个额外的“准属性”,用于标识鼠标x和y坐标if(ctl.EndsWith(".x")||ctl.EndsWith(".y")){controlId=ctl.Substring(0,ctl.Length-2);foundControl=page.FindControl(controlId);}else{foundControl=page.FindControl(ctl);}if(!(foundControlisButton||foundControlisImageButton))continue;control=foundControl;break;}}returncontrol==null?String.Empty:control.ID;}}回发参考,如何检查哪个控件导致了Page_Init事件中的回发动态控件的事件处理程序的工作了解JavaScript__doPostBack函数使用ASP.NET代码访问PostBack上的JavaScript变量ASP.NET如何知道在回发期间触发哪个事件?从服务器控件中删除“名称”属性?如何在asp.net中使用__doPostBack()Postback是由java脚本函数__doPostback(source,parameter)完成的,所以在你的情况下它将是__doPostback("lnkDynamic123","")这样的东西所以在代码中执行以下操作后面varbtnTrigger=Request["__EVENTTARGET"];if(btnTrigger=="lnkDynamic123"){}—这将告诉您导致回发的原因是您的链接按钮向页面添加一个LinkBut??ton之后,您可以将调用移至GetPostBackControlId方法:protectedvoidPage_Load(objectsender,EventArgse){if(Page.IsPostBack){holder.Controls.Clear();LinkBut??tonlnkDynamic=newLinkBut??ton();lnkDynamic.Click+=newEventHandler(LinkClick);lnkDynamic.ID="lnkDynamic123";lnkDynamic.Text="lnkDynamic123";holder.Controls.Add(lnkDynamic);字符串IDValue=GetPostBackControlId(this.Page);如果(IDValue==lnkDynamic.ID)LinkClick(lnkDynamic,newEventArgs());}}这里调用点击事件处理程序也更接近于模仿标准的ASP.NET页面生命周期,其中Postback事件处理发生在Load事件之后编辑:如果必须创建一个LinkBut??tons,在确定控件ID之前,你可以为链接按钮ID创建命名方案,例如lnkDynamic_1、lnkDynamic_2等。Request["__EVENTTARGET"]将包含一个自动生成的控件ID,例如"ctl00"$mc$lnkDynamic_1",您可以使用它来识别哪个LinkBut??ton导致了回发。如果您正确获得了回发控件ID但FindControl没有返回那么可能是因为您正在使用母版页。基本上,someControl.FindControl(id)在someControl.NamingContainer命名容器中搜索控件。但在您的情况下,Button1控件位于ContentPlaceHolder1中,它是一个命名容器,而不是直接在Page命名容器,因此您无法通过调用Page.FindControl找到它。如果您无法预测要查找的控件将位于哪个命名容器中(例如,回发可能由两个不同的两个具有不同内容占位符的按钮),那么你可以编写一个扩展来递归地搜索控件,如下所示:;控制结果=默认(控制);foreach(Controlchildincontrol.Controls){result=child.FindControlRecursively(id);如果(结果!=默认(控制))中断;}返回结果;但请谨慎使用,因为此方法将返回它找到的具有指定id的第一个控件(并且您可以有多个具有相同id的控件——但它们应该位于不同的命名容器中;命名容器用于区分控件相同的id,就像命名空间是用来区分同名的类)。或者,您可以尝试FindControl(stringid,intpathOffset)重载,但我认为这非常棘手。另外,检查这个问题。第一种方法(不推荐,但更灵活)和一种完全不同的方法——虽然我真的不觉得我应该提倡它——是向表单添加隐藏字段。默认情况下,此隐藏字段可能具有类似false的值。如果单击其中一个动态按钮导致再次添加动态控件,您可以在执行回发之前在客户端将隐藏字段值更改为true(最终您想要/必须修改客户端onclick处理程序以实现此目的)。当然,更多的信息可以存储在这样的字段中,例如控件id和参数(但是您可以按照其他答案中的描述获取那些值)。在这种情况下,不需要命名模式。这个隐藏字段可能是“静态的”。所以它总是可以在代码中访问。无论如何,您可能想要实现一些东西以确保没有人在玩弄它的值并伪造一个看起来像是来自这些动态链接之一的回调。但是,这整个方法只是帮助您获取控件的ID。在再次创建控件之前,您将无法通过NamingContainer.FindControl获取实例(正如其他答案中已经提到的那样;))。如果您创建了它,则不再需要查找它。第二种方法(由于它的限制可能不合适)如果你想以一种干净的方式进行,你需要创建你的控件OnLoad,无论是否点击了某些东西。此外,动态控件ID必须与您首先发送给客户端的ID相同。您订阅它的Click或Command事件并将其可见性设置为false。在点击事件处理程序中,您可以再次将发件人可见性设置为true。这意味着,您不关心链接是否已创建,您只是不想将它发送给客户端。下面的示例当然仅适用于单个链接(但您可以轻松修改它以涵盖整个链接集)。以上就是C#学习教程:如何查看动态链接按钮引起的回传分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——dynamicButton.ID="linkDynamic123";//此id需要与您第一次将包含动态链接的页面发送到客户端时相同//dynamicButton.Click+=DynamicButton_Click;dynamicButton.Visible=false;控件。添加(动态按钮);}publicvoidDynamicButton_Click(objectsender,EventArgse){//当您在Page.Load期间创建控件时,将触发此事件。((LinkBut??ton)sender).Visible=true;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: