1

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

4

6 回答 6

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.
}

现在,如果您在LinkButtona或某种需要绑定来填充它的控件中使用,那么您可能需要实现一个事件处理程序来确定哪个被按下。您还可以将数据绑定到它的GridViewRepeaterRowCommandLinkButtonCommandArgument属性,以将一些唯一的行特定数据传递给偶数处理程序。

如果你有一堆LinkButtons 都使用完全相同的处理程序,最坏的情况是转换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
    }
}

如果我对您的问题不满意,请发表评论,我会尽力解决。

编辑:根据您的评论,由于其他一些限制,您必须知道Button它属于哪个。Page_Load好吧,没有干净的方法可以做到,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。由于您使用的是 aLinkButton您可以使用以下内容来获取导致回发的控件:

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

我已经用 a 测试了LinkButton它,它确实按预期工作。

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

于 2010-08-23T21:15:16.403 回答
1

我曾经不得不这样做,因为在事件处理程序中为时已晚。您可以使用 javascript 编写被点击到隐藏字段的按钮的 ID。比您可以在 Page_Load 中检索它。如果我没记错的话,另一种方法是查看 _EVENTTARGET 隐藏字段,已经有一段时间了。

于 2010-08-23T20:27:32.610 回答
1
protected void Page_Load(object sender, EventArgs e)
{
  if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID) 
  {
    // LinkButton1 was clicked
  }
}
于 2012-05-18T07:22:46.883 回答
0

您还可以声明一个 LinkBut​​ton(或 Control,或其他)类型的变量,并让按钮在 click 事件中使用对其自身的引用来更新它,然后检查 Load 处的值。

于 2010-08-23T20:27:56.500 回答
0

你的意思是当页面上的其他回发事件被触发时,你只是试图阻止 Page_Load 代码被执行?如果是这种情况,请将其包装在:

if (!IsPostBack)

(恕我直言,这有点像 WebForms 事件模型所必需的,但它就是这样。)

还是我误解了你的问题?

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

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

于 2010-08-23T20:22:56.047 回答
0

单独的处理程序是这里的方法,但您可以为每个按钮赋予一个独特的ItemCommand属性,并根据需要过滤这些属性。

于 2010-08-23T21:26:45.143 回答