我有一个按钮控制。在点击这个按钮,我需要动态地添加一个链接按钮。链接按钮需要一个事件处理程序。因此,动态链接按钮首先在Page_Load添加和清除,并且在按钮单击处理程序再次添加。请阅读动态控制的事件处理程序的工作理解这样做的业务需求。
我读On回发,我怎么能检查哪些控制回发在Page_Init事件识别导致回发(里面的Page_Load)的控制。但它不工作对我的方案。
需要什么变化工作要做,以确认是否回传被链接按钮(里面的Page_Load)引起的?
注意:请参考下面的另一个场景,这是不可避免的http://$c$creview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application
注1:我需要回发的控制ID作为内如果(Page.IsPostBack)
的第一步。我需要添加动态链接按钮控制,只有当它是从按钮或链接按钮回发。还有其他控件导致回发。对于这样的回传,我们不应该执行这个code。
注2:我收到空字符串请求[__ EVENTARGUMENT]
在Page_Load
有关问题的:通过什么事件
,动态控件将在页面(使用的FindControl)提供。 @Tung说 - 你GetPostBackControlId方法得当越来越引起回发的控件的名称,但它无法通过page.FindControl找到与该ID的控制,因为LinkButton的还没有被创建,所以页不知道它的存在。
ASPX
<%@页面语言=C#AutoEventWireup =真正的codeFILE =PostbackTest.aspx.cs继承=PostbackTest
的MasterPageFile =〜/ TestMasterPage.master%>
< ASP:内容ID =为myContentContentPlaceHolderID =ContentPlaceHolder1=服务器>
< DIV ID =持有人=服务器>
< / DIV>
< ASP:按钮的ID =Button1的=服务器文本=按钮的OnClick =TestClick/>
< / ASP:内容>
code背后
公共部分类PostbackTest:System.Web.UI.Page
{
保护无效的Page_Load(对象发件人,EventArgs的)
{
如果(Page.IsPostBack)
{
字符串IDValue = GetPostBackControlId(this.Page);
INT X = 0;
holder.Controls.Clear();
LinkButton的lnkDynamic =新的LinkButton();
lnkDynamic.Click + =新的EventHandler(LinkClick);
lnkDynamic.ID =lnkDynamic123;
lnkDynamic.Text =lnkDynamic123;
holder.Controls.Add(lnkDynamic);
}
}
保护无效TestClick(对象发件人,EventArgs的)
{
holder.Controls.Clear();
LinkButton的lnkDynamic =新的LinkButton();
lnkDynamic.Click + =新的EventHandler(LinkClick);
lnkDynamic.ID =lnkDynamic123;
lnkDynamic.Text =lnkDynamic123;
holder.Controls.Add(lnkDynamic);
}
保护无效LinkClick(对象发件人,EventArgs的)
{
}
公共静态字符串GetPostBackControlId(页)
{
如果(!page.IsPostBack)
{
返回的String.Empty;
}
控制控制= NULL;
//首先检查__EVENTTARGET与_doPostBack功能控制
字符串控件名称= page.Request.Params [__ EVENTTARGET];
如果(!String.IsNullOrEmpty(控件名称))
{
控制= page.FindControl(控件名称);
}
其他
{
//如果__EVENTTARGET为空,控制按钮式
字符串控件ID;
控制foundControl;
的foreach(在page.Request.Form串CTL)
{
//具有附加准属性,在他们的标识识别鼠标x和y坐标它们拉手的ImageButton
如果(ctl.EndsWith(。X)|| ctl.EndsWith(。y)的)
{
控件ID = ctl.Substring(0,ctl.Length - 2);
foundControl = page.FindControl(控件);
}
其他
{
foundControl = page.FindControl(CTL);
}
如果(!(foundControl是按钮|| foundControl是的ImageButton))继续;
控制= foundControl;
打破;
}
}
返回控制== NULL?的String.Empty:control.ID;
}
}
参考
On回发,我怎么能检查哪些控制回发在Page_Init事件 动态控件的事件处理程序的工作 了解__doPostBack的JavaScript功能 在使用ASP.NET code上回发访问JavaScript变量 How不知道ASP.NET回发时触发的事件? ASP.NET:如何从服务器控件删除name属性? 如何使用__doPostBack() 解决方案在asp.net回发是由Java脚本函数__doPostBack(来源参数)做
所以你的情况这将是
__doPostBack(lnkDynamic123,),这样的事情
因此,在code后面做以下
VAR btnTrigger =请求[__ EVENTTARGET];
如果(btnTrigger ==lnkDynamic123)
{
}
- 这将告诉大家,这是你的LinkButton,导致回发
I have a button control. On click of this button I need to add a Link Button dynamically. The Link Button needs an event handler. Hence the dynamic Link button is first added in the Page_Load and cleared and added again in the button click handler. Please read Dynamic Control’s Event Handler’s Working for understanding the business requirement for this.
I have read On postback, how can I check which control cause postback in Page_Init event for identifying the control that caused the postback (inside Page_Load). But it is not working for my scenario.
What change need to be done to confirm whether the postback was caused by link button (inside Page_Load)?
Note: Refer the following for another scenario where it is inevitable http://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application
Note 1: I need to get the postback control ID as the first step inside if (Page.IsPostBack)
. I need to add the dynamic link buttons control only if it is a postback from the button or the link button. There will be other controls that causes postback. For such postbacks we should not execute this code.
Note 2: I am getting empty string for Request["__EVENTARGUMENT"]
in the Page_Load
Related Question: By what event
, the dynamic controls will be available in the Page (for using in FindControl). @Tung says - "Your GetPostBackControlId method is properly getting the name of the control that caused the postback, but it is unable to find a control with that id through page.FindControl because the linkbutton has not been created yet, and so page does not know of its existence. "
ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PostbackTest.aspx.cs" Inherits="PostbackTest"
MasterPageFile="~/TestMasterPage.master" %>
<asp:Content ID="myContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="holder" runat="server">
</div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClick" />
</asp:Content>
CODE BEHIND
public partial class PostbackTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
{
string IDValue = GetPostBackControlId(this.Page);
int x = 0;
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
}
protected void TestClick(object sender, EventArgs e)
{
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
protected void LinkClick(object sender, EventArgs e)
{
}
public static string GetPostBackControlId(Page page)
{
if (!page.IsPostBack)
{
return string.Empty;
}
Control control = null;
// First check the "__EVENTTARGET" for controls with "_doPostBack" function
string controlName = page.Request.Params["__EVENTTARGET"];
if (!String.IsNullOrEmpty(controlName))
{
control = page.FindControl(controlName);
}
else
{
// if __EVENTTARGET is null, the control is a button type
string controlId;
Control foundControl;
foreach (string ctl in page.Request.Form)
{
// Handle ImageButton they having an additional "quasi-property" in their Id which identifies mouse x and y coordinates
if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
{
controlId = ctl.Substring(0, ctl.Length - 2);
foundControl = page.FindControl(controlId);
}
else
{
foundControl = page.FindControl(ctl);
}
if (!(foundControl is Button || foundControl is ImageButton)) continue;
control = foundControl;
break;
}
}
return control == null ? String.Empty : control.ID;
}
}
REFERENCE
On postback, how can I check which control cause postback in Page_Init event Dynamic Control’s Event Handler’s Working Understanding the JavaScript __doPostBack Function Access JavaScript variables on PostBack using ASP.NET Code How does ASP.NET know which event to fire during a postback? ASP.NET: how to remove 'name' attribute from server controls? How to use __doPostBack()解决方案
A postback in asp.net is done by the java script function __doPostback(source, parameter)
so in your case it would be
__doPostback("lnkDynamic123","") something like this
So in the code behind do the following
var btnTrigger = Request["__EVENTTARGET"];
if(btnTrigger=="lnkDynamic123")
{
}
--- this would tell that it is your linkbutton that causes the postback