更新:我在网上找到的最清晰的解释,因为我一直在努力寻找here。
也许我只是不太了解runat服务器的模型。似乎以下代码始终执行if块。如果代码在服务器端运行,我想我可以理解它必须是无状态的。
我是一名经验丰富的非网络程序员,但对我而言似乎有点直观。我是否需要创建某种会话对象或者在URL中传递当前状态或者什么?
<script runat="server">
DateTime begin;
DateTime end;
int iSelectedStart = 0;
int iSelectedEnd = 0;
int iPutName = 0;
protected void Button1_Click(object sender, EventArgs e)
{
if (iPutName == 0)
{
iPutName = 1;
Label1.Text = TextBox1.Text + " you will be slecting your start and end dates.";
答案 0 :(得分:2)
这里要记住的重要一点是网络是无国籍的。来自某人浏览器的每个请求都与之前的所有请求完全分开。您的代码发生的事情是每次客户端请求页面时都会从头开始实例化该类。这包括单击Button1。
如果要在请求之间保留值,则必须将其存储在稍后可以检索的位置。 Session对象为您提供此功能。
基本上,您需要以某种方式将iPutName变量存储在会话中。可能最好的方法是将其封装在属性中:
protected int iPutName
{
get {
if (Session["iPutName"] == null)
Session["iPutName"] == 0;
return Session["iPutName"];
}
set { Session["iPutName"] = value; }
}
编辑: ViewState对象也可以正常工作(只要在页面上打开ViewState)。这会对HTML中隐藏字段中的值进行编码,并在返回时对其进行解码。
编辑(再次):为重复编辑道歉,但我应该清除它。乔纳森和埃米尔所说的是正确的。您可能应该使用ViewState而不是Session,除非您希望此值在页面之间保持可访问状态。请注意,这确实需要ViewState is turned on,这将导致更大的有效负载被发送到客户端。
答案 1 :(得分:2)
看起来你的代码的一部分被切断了,但这是网络编程的基本内容 - 它是无状态的。除非,即你做某事(使用ViewState,Session等)将一些状态添加到混合中。
在您的情况下,看起来您希望通过刷新页面来维护某些状态。将要保留的值放在ViewState中,以使它们在回发中保持同一页面。如果要在站点上的页面中保存值,请使用会话。如果您希望在访问网站时保持值,请将它们放在数据库中并将它们绑定到登录名或cookie。
答案 2 :(得分:2)
我真的建议您查看快速入门教程。
http://quickstarts.asp.net/QuickStartv20/aspnet/Default.aspx
点网中有很多概念可以在UI上模拟状态。 在你的情况下,我认为你真正想做的是使用viewstate。应谨慎使用会话,我认为您正在寻找的概念本地化到页面而非本地用户会话。
您还应该查看codebehind / codefront的概念。
答案 3 :(得分:0)
因为ASP.NET是无状态的,所以你假设是正确的。回发将导致页面丢失iPutName的变量。存储在会话中是一种选择,或者存储在viewstate中可能是另一种选择。
这里要理解的主要内容是ASP.NET页面生命周期的工作原理以及每次回发到服务器时会发生什么。
答案 4 :(得分:0)
对于生命周期,请查看以下网址: http://www.eggheadcafe.com/articles/20051227.asp
您可以通过以下方式将iPutName存储在会话中:
Session["iPutName"] = iPutName;
获取会话变量也很容易,但是你应该确保进行NULL检查,如下所示:
if (Session["iPutName"] != null) iPutName = Session["iPutName"];
没有测试任何这个,但如果你遇到错别字...抱歉;)
答案 5 :(得分:0)
您在更新中发布的网址肯定不是关于ViewState的“所有您想知道的”....甚至没有关闭。我只扫描了他的文章,但他似乎根本没有解决Page Life Cycle问题。如果您进入View State路线,请阅读以下2个链接:
Understanding ASP.NET View State by Scott Mitchell
Truly Understanding ViewState By Dave Reed
如果您是ViewState的新用户,请转储所有关于解析链接文章中提到的ViewState的guff(文章的一半)。除了高度专业化的场景之外,它根本不是必需的。做re:绝对不是一件正常事:ViewState。