【问题标题】:ASP.NET and C# Page instance and ArrayList variableASP.NET 和 C# Page 实例和 ArrayList 变量
【发布时间】:2014-12-22 18:08:26
【问题描述】:

因此,从 Windows 应用程序开始涉足 Web 应用程序,并且仍在尝试了解一些基础知识。要求基本上是有一个文本框、一个按钮和一个标签。单击按钮时,文本框会显示一个介于 1 和 100 之间的伪随机生成的数字。标签会将这些数字作为逗号分隔值进行跟踪,而文本框将使用生成的 最新 值进行更新每次点击按钮的次数。

在客户端浏览器中查看的网页有两个 HTML 控件和一个 asp web 控件:

<input type="text" id="txtOne" runat="server"/>
<input type="button" id="btnOne" value="Generate" runat="server" onserverclick="btnOne_OnClick"/>
<asp:Literal ID="lblOne" runat="server"></asp:Literal>

在服务器上使用支持的 C# 类:

    public partial class Contact : System.Web.UI.Page
{

    protected HtmlInputText txtOne = new HtmlInputText();
    protected HtmlInputButton btnOne = new HtmlInputButton();
    protected int randomNum;
    Random r = new Random();
    protected System.Collections.ArrayList numbers = new System.Collections.ArrayList();
    protected string text;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnOne_OnClick(object sender, EventArgs e)
    {
        randomNum = r.Next(1, 100);
        txtOne.Value = randomNum.ToString();
        updateLabel(randomNum.ToString());
    }

    protected void updateLabel(string value)
    {
        numbers.Add(value);
        foreach (string number in numbers)
        {
            text += number + ',';
        }

        //Remove the end ','
        lblOne.Text = text.Substring(0, text.Length - 1);
    }

但是,当单击按钮时,仅将生成的最新数字输出到标签。我曾假设 ArrayList 将继续存储以前的值,而迭代器循环会将所有这些值检索到 text 变量中。

当 Page 对象被发送回客户端时,是否会发送相当于一个新的 Page 实例?似乎是这样,如果是这样,用什么方法来解决这个问题?

我想我可以使用标签的值并每次都用新值递增它(代替 ArrayList),但我想使用 ArrayList 逻辑来解决它或理解为什么这不是正确。


临时编辑:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

namespace myProj
{
    public partial class Contact : System.Web.UI.Page
    {

        protected TextBox txtOne = new TextBox();
        protected Button btnOne = new Button();
        protected int randomNum;
        Random r = new Random();
        protected List<string> numbers = new List<string>();
        protected string text;

        protected void btnOne_OnClick(object sender, EventArgs e)
        {
            //txtOne.Text = randomNum.ToString();
            randomNum = r.Next(1, 100);
            updateLabel(randomNum.ToString());
        }

        protected void updateLabel(string value)
        {
            if (Session["numbers"] != null)
            {
                numbers = (List<string>)Session["numbers"];
            }

            numbers.Add(value);
            Session["numbers"] = numbers;

            foreach (string number in numbers)
            {
                text += number + ',';
            }

            //Remove the end ','
            lblOne.Text = text.Substring(0, text.Length - 1);
        }

    }
}

【问题讨论】:

  • 不要使用&lt;input type="text"&gt;&lt;input type="button"&gt;,使用&lt;Asp:TextBox&gt;&lt;Asp:Button&gt;。字段(例如您的示例中的numbers)不会在请求之间持续存在,每个请求都会获得一个新实例。要保持价值,您需要使用会话变量,例如Session["Numbers"].
  • RE 控件;我原来是这样的。我切换到 HTML 控件进行另一次测试,但没有将它们切换回来;我应该这样做。但是,我认为这不会影响上述问题?
  • 数组列表?与 2010 年相比?大福。
  • @Will:礼貌的说法是,“不要使用ArrayList。自.NET 2.0 起已弃用。请改用List&lt;string&gt;
  • 我明白了;我在工作中继续使用 Java。感谢@Will 的善意评论,我只能佩服这种有效的知识共享方式。

标签: c# asp.net webforms


【解决方案1】:

每当点击按钮时,页面都会刷新所有变量 被重新初始化,因此arraylist将变为空,因此它将如何保留 所有值。您可能需要将此数组列表存储在 Session 中,然后 从会话中读取并循环。

单击按钮时,您将首先从会话中读取值并将其分配给数字,然后在其中添加新生成的数字,然后再次将列表分配给会话。

Session["numbers"]=numbers;

当从会话中读取时

numbers=(ArrayList)Session["numbers"];

将您的 updatelabel 方法更改为下面给出的,一切正常

protected void updateLabel(string value)
{
    if(Session["numbers"]!=null)
        numbers = (ArrayList)Session["numbers"];
    numbers.Add(value);
    Session["numbers"] = numbers;


    foreach (string number in numbers)
    {
        text += number + ',';
    }

    //Remove the end ','
    lblOne.Text = text.Substring(0, text.Length - 1);

}

【讨论】:

  • 如果所有变量都已初始化,并且在刷新页面(单击按钮时)时List(以前的ArrayList)为空,如何赋值'Session["list"]=numbers ' 包括以前随机生成的数字吗?
  • 您将首先从会话中读取值并在其中添加新数字,然后再次存储在会话中。
  • 谢谢。但是如果 Session[] 变量是在方法 (btnOne_OnClick) 中声明的,那么方法 (Page_Load) 如何访问存储在其中的值?它不必被声明为 ivar 吗?我试过这个没有成功。
  • 会话随处可访问。
  • 我仍然无法让它运行。我一直在研究您的建议,但单击按钮后,页面会刷新,标签中没有任何值。我已经使用“临时编辑”编辑了我的原始问题,而我正在使用的当前代码不成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2019-03-28
相关资源
最近更新 更多