我如何通过一个值从Button_Click事件Page_Load

本文关键字:Button Click 事件 Load Page 一个 何通过 | 更新日期: 2023-09-27 18:15:47

似乎我正在与页面生命周期的顺序作斗争。基于用户选择按钮1或2,我需要在Page_Load事件期间动态添加相应的控件。我的问题是,当一个按钮被单击Page_Load事件之前执行的Button_Click事件代码读取。在那里,我的变量"doWhat"直到Page_Load事件之后才赋值。我怎么能有"doWhat"变量分配一个值在Page_Load期间读取?

下面是两个按钮的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事件Page_Load

如果您熟悉javascript,那么您可以通过在设计和代码中进行以下更改来实现它。在aspx页面中添加一个隐藏字段。您的HTML代码应该是这样的。<>之前<表单id runat="server">& lt;div>& lt;脚本type = " text/javascript祝辞var doWhatAction = function (actionIndex) {//警报(actionIndex);. getelementbyid("& lt; % = HiddenField1.ClientID %祝辞")。value = actionIndex;返回true;}& lt;/script>& lt;/div>& lt;/form>

你的代码会是…

    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); 
    }

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

  1. 在form

  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

后面的代码

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

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

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

__doPostBack函数在页面的源代码中不可见,直到您放置LinkButton或将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****/
    }
}