ViewState 背后的 ASPX 代码未保存
ASPX code behind ViewState not saving
我正在尝试使用 ViewState 在回发期间保留文本框的输入。这是代码:
private Label store_Incident_Number = new Label();
private TextBox Incident_Number = new TextBox();
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["Incident_Number"] != null)
{
store_Incident_Number.Text = "TEST" + (string)ViewState["Incident_Number"];
Panel1.Controls.Add(store_Incident_Number);
}
}
void Page_PreRender(object sender, EventArgs e)
{
ViewState.Add("Incident_Number", Incident_Number.Text);
}
以上代码位于我的 default.aspx.cs(后面的代码)中。 Panel1
是一个 asp 控件,位于网页上表单标记之外的某个位置。我正在尝试遵循此示例:https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx
我希望 Incident_Number 文本框的文本在页面回发后保存到标签上,但它似乎不起作用,我无法找出问题所在。请注意,文本框是动态添加到页面表单中的,并在每次回发时重新创建。我的问题是我如何编写代码以在页面回发后保留文本框的值?
EDIT: Fixed! Please see my accepted answer. Also, any eventhandler
or other process that have potential to trigger another postback
during Page_Init will refresh your value saved in viewstate (i.e. saved text is gone).
发生这种情况是因为页面加载方法在预呈现之前运行。您可以 Google asp.net 页面 lifecicle 找到更多详细信息。
您在这里所做的基本上是在将标签值添加到视图状态之前加载标签值。
此外,如果您能告诉我们您是如何进行回传的,将会有所帮助。因为例如点击事件也是页面生命周期的一部分,这可能会改变一些事情。
正如我在评论中提到的,您不会让 WebForms 系统为您工作。下面是一个表单示例,其中包含动态创建的控件来维护视图状态。根据您的描述,面板在表单之外。
当页面显示时,您可以输入新的文本并重复点击提交。 TextBox 值将自动保留。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
</form>
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
</body>
</html>
Default.aspx.cs
using System;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
private Label store_Incident_Number = new Label();
private TextBox Incident_Number = new TextBox() { ID = "TextBox1" };
private Button SubmitButton = new Button() { ID = "Button1", Text = "Submit" };
protected void Page_Init(object sender, EventArgs e)
{
// what is created during this event has viewstate restored to it
Panel1.Controls.Add(store_Incident_Number);
form1.Controls.Add(Incident_Number);
form1.Controls.Add(SubmitButton);
}
protected void Page_Load(object sender, EventArgs e)
{
// the viewstate has already been restored so you can access the content of the TextBox
store_Incident_Number.Text = Incident_Number.Text;
}
}
我正在尝试使用 ViewState 在回发期间保留文本框的输入。这是代码:
private Label store_Incident_Number = new Label();
private TextBox Incident_Number = new TextBox();
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["Incident_Number"] != null)
{
store_Incident_Number.Text = "TEST" + (string)ViewState["Incident_Number"];
Panel1.Controls.Add(store_Incident_Number);
}
}
void Page_PreRender(object sender, EventArgs e)
{
ViewState.Add("Incident_Number", Incident_Number.Text);
}
以上代码位于我的 default.aspx.cs(后面的代码)中。 Panel1
是一个 asp 控件,位于网页上表单标记之外的某个位置。我正在尝试遵循此示例:https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx
我希望 Incident_Number 文本框的文本在页面回发后保存到标签上,但它似乎不起作用,我无法找出问题所在。请注意,文本框是动态添加到页面表单中的,并在每次回发时重新创建。我的问题是我如何编写代码以在页面回发后保留文本框的值?
EDIT: Fixed! Please see my accepted answer. Also, any eventhandler or other process that have potential to trigger another postback during Page_Init will refresh your value saved in viewstate (i.e. saved text is gone).
发生这种情况是因为页面加载方法在预呈现之前运行。您可以 Google asp.net 页面 lifecicle 找到更多详细信息。
您在这里所做的基本上是在将标签值添加到视图状态之前加载标签值。
此外,如果您能告诉我们您是如何进行回传的,将会有所帮助。因为例如点击事件也是页面生命周期的一部分,这可能会改变一些事情。
正如我在评论中提到的,您不会让 WebForms 系统为您工作。下面是一个表单示例,其中包含动态创建的控件来维护视图状态。根据您的描述,面板在表单之外。
当页面显示时,您可以输入新的文本并重复点击提交。 TextBox 值将自动保留。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
</form>
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
</body>
</html>
Default.aspx.cs
using System;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
private Label store_Incident_Number = new Label();
private TextBox Incident_Number = new TextBox() { ID = "TextBox1" };
private Button SubmitButton = new Button() { ID = "Button1", Text = "Submit" };
protected void Page_Init(object sender, EventArgs e)
{
// what is created during this event has viewstate restored to it
Panel1.Controls.Add(store_Incident_Number);
form1.Controls.Add(Incident_Number);
form1.Controls.Add(SubmitButton);
}
protected void Page_Load(object sender, EventArgs e)
{
// the viewstate has already been restored so you can access the content of the TextBox
store_Incident_Number.Text = Incident_Number.Text;
}
}