我有一个我正在编写的应用程序,它通过遍历节点,然后使用当前节点的信息更新页面来工作。我在页面中有一个UpdatePanel,其中包含标签,文本框和按钮。标签列出当前节点的当前可用子节点,用户输入他们想要进入文本框的子节点,然后单击提交按钮。我在提交按钮的事件处理程序中设置了节点的新值。
这是我的问题:每当我输入要导航到的节点时,对象会将其值重置为最初初始化为的值。我甚至将相同的代码放入Windows窗体中以验证它是否正常迭代我的树,并且它可以正常工作,所以我知道我的问题是与AJAX相关的。
这是我用AJAX编写的第一个应用程序,因此我仍然在学习它是如何工作的。任何帮助将不胜感激。我一直在谷歌搜索并搜索过。
这是HTML:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="question" runat="server" Text=""></asp:Label>
<br />
<asp:TextBox ID="answer" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Submit" runat="server" Text="Submit" onclick="Submit_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
和C#:
protected void Submit_Click(object sender, EventArgs e)
{
int ans = int.Parse(answer.Text);
if (!current.ChildIDs.Contains(ans))
{
return;
}
current = tree.Node(ans);
question.Text = current.Question;
}
current是当前节点,它具有所有子节点ID的公共ArrayList。树是我拥有的NodeTree;调用Node只返回新节点。当前和Tree都在Page_Load事件中初始化,并且只触发一次(首次加载页面时)。
这简直就是代码;我很难理解为什么AJAX无法正常工作。
答案 0 :(得分:5)
我甚至把相同的代码放入了 Windows窗体验证它是什么 正确地进行迭代 我的树,它应该工作,所以 我知道我的问题与AJAX有关。
听起来你期望ASP.NET能够记住请求之间的对象current
,因为这就是Windows构建应用程序的工作方式。
Web应用程序是无状态的 - 在每次请求之后,ASP.NET会丢弃所有变量。要在后续请求期间访问变量,您必须:
1)发送足够的数据以及重建变量的请求。您可以使用查询字符串参数或HTML表单值(隐藏字段提到另一个响应)来执行此操作。
2)将变量保存在Session
存储中(可以在内存中或由数据库支持)。
3)将值存储在coookie中。
在这三个中,最简单的方法是告诉您如何使用Session
,考虑到您在问题中分享的内容。但是,请注意:会话有其风险 - 默认情况下,ASP.NET会话对象存储在内存中,这可能存在安全隐患。但是,您应该如何使应用程序正常工作。
// In your Page_Load code that initializes your 'current' variable
// When the user first requests the page, create a new Node
if (! this.IsPostBack)
{
Node current = new Node(); //
Session("currentNode") = current;
}
// When the user clicks a button on the page (posts), use the
// node in session instead
else
{
current = Session("currentNode");
}
答案 1 :(得分:1)
当您更新浏览器中的非表单元素(标签,文字等)时,.NET无法看到您所做的任何更改。
尝试为记录新值的每个标签添加隐藏输入。然后在您连接到按钮的OnClick事件的方法中,执行以下操作:
myLabel.Text = myHiddenInput.value;
答案 2 :(得分:0)
我认为您只需告诉updatepanel更新自己。试试这个:
protected void Submit_Click(object sender, EventArgs e)
{
int ans = int.Parse(answer.Text);
if (!current.ChildIDs.Contains(ans))
{
return;
}
current = tree.Node(ans);
question.Text = current.Question;
UpdatePanel.Update();
}