1

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

并且每个按下的数字和按钮,都应该按顺序保存在这个数组中(例如: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>

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

有人有解决方案吗?

谢谢!

4

2 回答 2

1

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

<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;
}
于 2012-04-21T19:22:35.980 回答
1

当然,Load是 ASP.Net 的 Page生命周期的一部分。

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

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

    if (Session["CurrentArr"] != null)
    {
        CurrentArr = (string[])Session["CurrentArr"];
    }
    else
    {
        CurrentArr = new string[length]; //where is length defined?
        Session["CurrentArr"] = CurrentArr;
    }
于 2012-04-21T17:18:41.893 回答