【问题标题】:How can I pass a value from a Button_Click event to Page_Load如何将 Button_Click 事件中的值传递给 Page_Load
【发布时间】:2014-07-30 18:54:09
【问题描述】:

我似乎在为页面生命周期的顺序而苦苦挣扎。根据用户选择按钮 1 或 2,我需要在 Page_Load 事件期间动态添加相应的控件。我的问题是单击按钮时,在读取 Button_Click 事件代码之前执行 Page_Load 事件。直到 Page_Load 事件之后,我的变量“doWhat”才被赋值。如何在 Page_Load 期间为“doWhat”变量分配要读取的值?

下面是两个按钮的asp.net表单代码:

<form id="form1" runat="server">
<div>
    <asp:Button ID="Button1" runat="server" Text="Button 1" onclick="Button_Click" />
    <asp:Button ID="Button2" runat="server" Text="Button 2" onclick="Button_Click" />
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</div>
</form>

下面是代码:

 int doWhat;

protected void Page_Load(object sender, EventArgs e)
{
   doWhat = Convert.ToUInt16(ViewState["doWhat"]);

    if (doWhat == 1)
    {
        // code to dynamically load group 1 controls
    }
    else 
    {
        // code to dynamically load group 2 controls
    }
    Label1.Text = Convert.ToString(doWhat);
}

protected void Button_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    if (btn.ID == "Button1")
    {
        doWhat = 1;
    }
    else
    {
        doWhat = 2;
    }
    ViewState.Add("doWhat", doWhat);  
}

【问题讨论】:

  • 如果您需要在一个请求中执行此操作,那么您的方法是不正确的,因为页面加载在 Button_Click 之前执行,之后将不会再次执行
  • 您是否有任何理由希望在pageload 中创建动态控件?相反,您可以将该代码封装为两个不同的函数,并在Button_Click 中调用相应的函数。在这种情况下,页面生命周期的顺序不会影响您。
  • 嗨 Dennis R,是的,我认为控件需要在 Page_Load 中创建,因为它们将附加事件处理程序。看来它们需要在 Page_Load 中创建才能正常工作。
  • Sergey,是的,这是我的问题,您有什么建议可以让我将该变量传递回 Page_Load 事件以供读取吗?

标签: c# asp.net


【解决方案1】:

如果您对 javascript 感到满意,那么您可以通过对您的设计和代码进行以下更改来实现它。在您的 aspx 页面中添加一个隐藏字段。您的 HTML 代码应该是这样的。

您的代码将类似于...

    int doWhat;
    protected void Page_Load(object sender, EventArgs e)
    {
        //doWhat = Convert.ToUInt16(ViewState["doWhat"]);
        doWhat = Convert.ToUInt16(HiddenField1.Value);

        if (doWhat == 1)
        {
            // code to dynamically load group 1 controls
        }
        else
        {
            // code to dynamically load group 2 controls
        }
        Label1.Text = Convert.ToString(doWhat);
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        //Do Nothing

        //Button btn = sender as Button;
        //if (btn.ID == "Button1")
        //{
        //    doWhat = 1;
        //}
        //else
        //{
        //    doWhat = 2;
        //}
        //ViewState.Add("doWhat", doWhat); 
    }

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用 jquery 或 javascript。

    1. 在表单中取隐藏变量

    2. 在javascript中的按钮点击事件时初始化它

    3. 在页面加载中读取隐藏变量的值

    <head >
        <title>Hidden Variable</title>
         <script type="text/javascript">
             function SetHDNValue()
             {
                var hdnControlID = '<%= hdnControl.ClientID %>';
                document.getElementById(hdnControlID).value=1;
             }
        </script>
    </head>
    
    
    
    <body >
        <form id="form1" runat="server">
        <div>  
            <input id="hdnControl" type="hidden" runat="server" />  
    
            <asp:Button ID="btnJSValue" Text="Click" runat="server" OnClientClick="SetHDNValue()" 
    />
        </div>
    
        </form>
    </body>
    

    在文件 hdnControl.value 后面的代码中

    【讨论】:

      【解决方案3】:

      从很久以前我就不再使用 asp.net 表单了。忘记做事了。但我发现你怎么能做。就像在stackoverflow链接上一样,答案是错误的。我从链接中复制了主要语句,这些语句指示回发事件的工作方式以及如何将其用于您的目的。更多http://aspsnippets.com/Articles/How-to-find-the-control-that-caused-PostBack-in-ASP.Net.aspx

      所有控件都接受 Button 和 ImageButton 使用 JavaScript 来导致回发。 要在这些控件上启用回发,必须将 AutoPostBack 属性设置为 true

      当您将此属性设置为 true 时,__doPostBack 函数会在导致回发的事件上调用。

      __doPostBack 函数在页面源中不可见,除非您为上述任何控件放置一个 LinkBut​​ton 或将 AutoPostBack 设置为 true

      以下是生成的 __doPostBack 的外观:

      <script type = "text/javascript">
      function __doPostBack(eventTarget, eventArgument) {
      if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
          theForm.__EVENTTARGET.value = eventTarget;
          theForm.__EVENTARGUMENT.value = eventArgument;
          theForm.submit();
      }
      }
      </script> 
      

      __doPostBack 函数只是将以下两个参数存储在两个隐藏字段中

      1. eventTarget - 导致回发的控件的名称
      2. eventArgument – 要发送到服务器的参数。

      只有在 AutoPostBack 设置为 true 时才会出现的两个隐藏字段中

      最后,您可以通过获取导致回发的控件的 ID 来区分:

      if (IsPostBack)
      {
          string CtrlID = string.Empty;
          if (Request.Form["__EVENTTARGET"] != null &&
              Request.Form["__EVENTTARGET"] != string.Empty)
          {
              CtrlID = Request.Form["__EVENTTARGET"];
      
              /****implement Your logic depending on control ID****/
          }
      
      }
      

      【讨论】:

      • qwr,感谢您的洞察力。这种方法效果很好。如果我使用复选框之类的控件,我可以获取导致回发的控件 ID 并在 Page_Load 中使用它。我确实将回发属性添加到按钮,但它不是该控件的有效属性。关于如何将其添加到按钮的任何想法。
      • 为所有复选框添加 runat="server" AutoPostBack="true" 。这样我相信它应该在复选框被更改时调用。我想知道您使用复选框作为切换按钮还是只是选项???如果是选项,则只需放置一个普通按钮并在事件内部检查复选框状态
      猜你喜欢
      • 2023-02-25
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多