2010-08-23 82 views
1

如何检查在页面的Page_Load中单击了哪个LinkButton。 这是为了避免调用服务,以便它只执行其事件中存在的内容。如何验证在Page_Load上在asp.net中单击哪个LinkBut​​ton

+1

为什么它必须在page_load?为什么不为每个链接按钮设置不同的事件处理程序,并在该功能中进行处理? – Tommy 2010-08-23 20:23:24

+0

页面加载执行与链接无关, – batwadi 2010-08-23 20:48:44

+3

对不起,但您的需求听起来像是一个不良设计的解决方法。我会建议你阅读关于asp.net的概念。凯尔西的答案是一个好的开始。 – Scordo 2010-08-23 21:25:49

回答

0

您的意思是说,您只是试图在页面上的其他回发事件触发时保持Page_Load代码不被执行?如果是这样的话,把它包装:

if (!IsPostBack) 

(恕我直言,这是一个有点被WebForms的事件模型必要一个黑客,但它是什么。)

还是我误解你的问题?

至于用于识别特定的LinkBut​​ton,你可以使用的CommandName参数:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx

1

我以前要做到这一点,因为在事件处理已经来不及了。你可以使用javascript来编写被点击到隐藏字段的按钮的ID。比你可以在Page_Load中检索它。如果我没有记错,其他方法是查看_EVENTTARGET隐藏字段,这是一段时间。

0

你也可以声明一个LinkBut​​ton类型的变量(或者Control或者其他),并且让按钮在click事件中通过引用来更新它们,然后检查Load的值。

7

您的Page_Load应该运行的唯一一件事是您希望始终发出每一个请求的代码,或者让您只需运行一次即可在运行后检查中运行的代码。例如:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Put the all code you need to run with EVERY request here 

    // Then add a post back check for any code you want to ONLY run on the very 
    // first request to the page. 
    if (!IsPostBack) 
    { 
     // Code you only want to run the first time. Usually setup code to initalize 
     // DropDownLists, Grids or pre populate a form, etc... 
    } 
} 

LinkButton代码应该都在它自己的点击处理程序:

protected void yourLinkButton_Click(object sender, EventArgs e) 
{ 
    // code you want to execute when your button is clicked. This will run AFTER 
    // the Page_Load has finished. 
} 

现在,如果你LinkButtonGridViewRepeater或某些类型的控制使用的需要结合要填写它,那么您可能需要实现一个RowCommand事件处理函数来确定哪个LinkButton被按下。您还可以将数据绑定到它的CommandArgument属性,以将一些唯一的行特定数据传递给偶数处理程序。

如果你有一堆LinkButton都使用完全相同的处理程序,最坏的情况是投下sender,然后比较ID值。

protected void yourLinkButton_Click(object sender, EventArgs e) 
{ 
    LinkButton btn = (LinkButton)(sender); 
    if (btn.ID.Equals("Some control name you want to compare")) 
    { 
     // do something 
    } 
} 

如果我在你的问题上的标记,只是留下评论,我会尝试和整理出来。

编辑:基于您的评论听起来好像你必须知道它是在Page_Load由于一些其他方面的限制,其Button。那么在Page_Load没有干净的方式,但它可以完成。您需要检查密钥Request.Form并检查特定的按钮名称(只有被点击的Button应包含在密钥中)。例如:

if (Request.Form.AllKeys.Contains("yourButton1")) 
{ 
    // then do something based on yourButton1 
} 
else if (Request.Form.AllKeys.Contains("yourButton2")) 
{ 
    // then do something based on yourButton2 
} 
// etc... 

我不认为这是任何其他干净的方式来解决它。如果该框架包含导致在sender属性之一中回发的控件,那本来就不错。

另一个编辑:这完全滑了我的脑海。上面的编辑是你需要为Button做的,因为它没有填充__EVENTTARGET。由于您使用的是LinkButton您可以使用以下方法来得到什么控制引起后背部:

string controlNameThatCausedPostBack = Request.Form["__EVENTTARGET"]; 

我有一个LinkButton测试这和它的工作如预期。

。希望最终解决您的问题:)

+0

感谢Kelsey的详细回答。我会以相同的方式实现..问题是在我的页面我正在页面加载和检查一些隐藏字段值分页......我知道它非常糟糕的设计,但它已经实施,所以不能改变它 – batwadi 2010-08-24 17:53:38

+0

@ prakash我已经更新了我的答案,希望包含一些应该让你启动并运行的代码。让我知道你是否需要更多的帮助。 – Kelsey 2010-08-24 18:24:22

+0

感谢您给予您Kelsey的时间,但问题是LinkBut​​ton不会出现在请求参数中,因为我的知识只有按钮id进入请求参数。请咨询 – batwadi 2010-08-26 14:32:11

0

独立处理方法是去这里的方式,但你可以给每个按钮的唯一ItemCommand财产,过滤那些是必要的。

1
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID) 
    { 
    // LinkButton1 was clicked 
    } 
} 
相关问题