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