避免使用 AJAX Page_Load影响我的数组

本文关键字:Load 影响 我的 数组 Page AJAX | 更新日期: 2023-09-27 18:31:49

我有一个文本框,用户认为在上面放置数字,在他按下按钮后,数字应该传递给一个数组。

并且按下的每个数字和按钮都应按顺序保存在此数组中(例如:3,4,5,...)。

问题是,每次我按下按钮时,都会发生page_load。我有这个代码:

    protected string[] CurrentArr;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (CurrentArr != null)
        {
            CurrentArr = (string[])Session["CurrentArr"];      
        }
        else
            CurrentArr = new string[length];

哪个CurrentArr是随时间变化的数组。

我也尝试用 AJAX 解决它:

<asp:ScriptManager runat="server" ID="sm">
    </asp:ScriptManager>
    <asp:UpdatePanel runat="server" ID="update">
        <ContentTemplate>
        <input type="text" class="response" id="how_many" name="guess" placeholder="Enter your guess..." />
        <asp:Button runat="server" class="button red" id="generate" name="generate" value="Generate!" OnClick="guess_Click" />
        <asp:Button runat="server" class="button red" id="win" name="win" value="you won"   />
        </ContentTemplate>
    </asp:UpdatePanel>

但它对我的数组没有影响(尽管我的页面没有回发......

有人有解决方案吗?

谢谢!

避免使用 AJAX Page_Load影响我的数组

您使用的是 UpdatePanel,它本质上是 AJAXized 的。只需添加一个触发器部分即可捕获按钮点击:

<asp:UpdatePanel runat="server" ID="update">
    <ContentTemplate>
        <input type="text" class="response" id="how_many" name="guess" placeholder="Enter your guess..." />
        <asp:Button runat="server" class="button red" id="generate" name="generate" value="Generate!" OnClick="guess_Click" />
        <asp:Button runat="server" class="button red" id="win" name="win" value="you won"   />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="generate" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>

您可能会遇到的问题是您的数组没有通过回发持久化。试试你和 ed 从会话中得到什么、获取和设置什么。我不喜欢使用老式数组。考虑一个列表,它们更通用。如果你特别需要在最后有一个数组,那么只需使用 myList.ToArray();

private List<int> CurrentArr = new List<string>();
protected void Page_Load(object sender, EventArgs e)
{
    if(Session["CurrentArr"] != null)
    {
        //if there is something stored in the session variable then grab that as a working array
        CurrentArr = (List<string>)Session["CurrentArr"];
    }
    else
    {
        //if not, then initialize one
        CurrentArr = new List<string>();
        Session["CurrentArr"] = CurrentArr;
    }
}
protected void guess_Click(object sender, EventArgs e)
{
    //get reference to the button clicked like you said in your question
    var btnMyButton = sender as Button; 
    btnMyButton.Enabled = false; //example of using the reference, disable the button that was clicked
    //add the value of your text box to the array/list, sort, then update the session
    this.CurrentArr.Add(txtYourTextBox.Text);
    this.CurrentArr.Sort();
    Session["CurrentArr"] = this.CurrentArr;
}

当然,Load是ASP的一部分。网络的页面生命周期。

请参阅 Page.IsPostBack 以更好地控制您想要或不想运行的方法,具体取决于请求类型(是否是回发)。

在上面的代码中,这可能是你的意思:

    if (Session["CurrentArr"] != null)
    {
        CurrentArr = (string[])Session["CurrentArr"];
    }
    else
    {
        CurrentArr = new string[length]; //where is length defined?
        Session["CurrentArr"] = CurrentArr;
    }