UpdatePanel将对象重置为初始状态

jne*_*son 1 asp.net asp.net-ajax

我有一个我正在编写的应用程序,它通过迭代节点,然后使用当前节点的信息更新页面.我在页面中有一个UpdatePanel,其中包含标签,文本框和按钮.标签列出当前节点的当前可用子节点,用户输入他们想要进入文本框的子节点,然后单击提交按钮.我在提交按钮的事件处理程序中设置了节点的新值.

这是我的问题:每次我输入要导航到的节点时,对象会将其值重置为最初初始化为的值.我甚至将相同的代码放入Windows窗体中以验证它是否正常迭代我的树,并且它可以正常工作,所以我知道我的问题是与AJAX相关的.

这是我用AJAX编写的第一个应用程序,所以我仍然在学习它是如何工作的.任何帮助将不胜感激.我用Google搜索并搜索过来.

这是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>
Run Code Online (Sandbox Code Playgroud)

而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;
    }
Run Code Online (Sandbox Code Playgroud)

current是当前节点,它有一个包含所有子节点ID的公共ArrayList.树是我拥有的NodeTree; 调用Node只返回新节点.当前和Tree都在Page_Load事件中初始化,并且只触发一次(首次加载页面时).

这真的很简单的代码; 我只是很难理解为什么AJAX无法正常工作.

Jef*_*nal 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");
}
Run Code Online (Sandbox Code Playgroud)