UpdatePanel将对象重置为初始状态

时间:2011-01-13 17:12:28

标签: asp.net asp.net-ajax

我有一个我正在编写的应用程序,它通过遍历节点,然后使用当前节点的信息更新页面来工作。我在页面中有一个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无法正常工作。

3 个答案:

答案 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();

}
相关问题