我似乎正在努力处理页面生命周期的顺序。根据用户选择按钮1或2,我需要在Page_Load事件期间动态添加各自的控件。我的问题是,在单击按钮时,在读取Button_Click事件代码之前执行Page_Load事件。那里有我的变量" 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);
}
答案 0 :(得分:1)
如果您对javascript感到满意,那么您可以通过对设计和代码进行以下更改来实现。在aspx页面中添加隐藏字段。您的HTML代码应该是这样的。
<form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="Button 1" OnClick="Button_Click" OnClientClick="return doWhatAction(1);" /> <asp:Button ID="Button2" runat="server" Text="Button 2" OnClick="Button_Click" OnClientClick="return doWhatAction(2);" /> <asp:Label ID="Label1" runat="server" Text=""></asp:Label> <asp:HiddenField ID="HiddenField1" Value="1" runat="server" /> <script type="text/javascript"> var doWhatAction = function (actionIndex) { //alert(actionIndex); document.getElementById("<%=HiddenField1.ClientID%>").value = actionIndex; return true; } </script> </div> </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);
}
答案 1 :(得分:0)
在这种情况下你可以使用jquery或javascript。
接受表格中的隐藏变量
在javascript
在页面加载中读取隐藏变量的值
<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
后面的代码中答案 2 :(得分:0)
很久以前我没有使用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
函数,从而导致回发。
在您为上述任何控件设置LinkButton或将 AutoPostBack设置为true 之前,__doPostBack
功能在页面源中不可见。
以下是 __ 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
函数只将以下两个参数存储在两个隐藏字段中
在两个隐藏字段中,仅当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****/
}
}