我已经搜索了如何在 Web 表单应用程序中使变量全局化的答案,但无法获得正确的答案。 我有一个带有日期选择器的简单应用程序,当日期更改时,我将其存储在字符串变量(var_date)中 - 同时我导航到新页面(selectedDate)。我想让日期字符串变量可访问新页面。我该如何做到这一点?我已经尝试过工作正常的 global.asax 方法,但是如何动态分配新的变量值?
我的 Site.Master 代码:
<!-- Nav bar -->
<div class="top-nav">
<a runat="server" href="~/">SMT</a>
<div class="right-nav">
<input class="date-input" type="date" runat="server" id="datePicker1" onchange="handler(event);">
</div>
</div>
<script>
function handler(e) {
var_date = e.target.value;
window.location.href = "selectedDate";
}
</script>
</form>
我的 Global.asax.cs 代码:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
Application.Lock();
Application["var_date"] = "2024-03-23";
Application.UnLock();
}
在网络领域,没有全局变量的概念。一旦页面被发送到客户端,那么在服务器端,页面、页面类、变量都会被处理、销毁、从内存中删除,现在 Web 服务器就准备好接受和处理来自的页面了。任何其他用户。
您必须将网络服务器视为一台计算机。你必须接受并采用无状态这个术语。该术语意味着每次加载网页时,服务器都会从头开始生效,创建页面类背后的代码,然后运行代码,然后将网页发送回客户端。在服务器端,它不会在内存中维护该页面的副本(也不维护代码中变量的值)。因此,现在 Web 服务器只是闲置等待网页的下一次回发,其中页面生命周期再次开始。
因此,网络服务器一次仅处理和处理一页+后面的代码。一旦该页面被处理,那么所有代码和页面都会被抛出内存,并且不再存在于服务器上。
并且您不能使用应用程序启动,因为它仅在 Web 服务器启动时运行,而不是针对每个用户。因此,如果幸运的话,该活动可能只会每月或每周一次?
那么,如何将“值”从一页传递到下一页呢?
嗯,曾经“最”常见的方式是在 URL 中传递值。然后,当下一个页面加载时,它可以从 URL 中获取这些值。
当然,对于“一般”变量和值,这会导致 URL 非常混乱且美观。
但是,虽然网页不会持久存在并保留在内存中?对于每个用户,您可以使用 session[] 来维护值(在页面回发之间保留它们),也可以使用 session[] 将值传递到相关的下一个页面。
那么,在第一页上,我们可能会放入一个文本框(对于内置日期选择器,textmode = date)。
然后在下面,我们有一个按钮,单击时,我们运行服务器端代码,保存日期值,然后导航到第 2 页。
因此:
WebForm1.aspx
<h3>This is Webform1.aspx</h3>
<h3>Please select a date</h3>
<asp:TextBox ID="txtDate" runat="server"
TextMode="Date">
</asp:TextBox>
<br />
<br />
<asp:Button ID="cmdContinue" runat="server" Text="Continue to page 2"
OnClick="cmdContinue_Click" />
上面的代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void cmdContinue_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Parse(txtDate.Text);
Session["MyDate"] = dt;
Response.Redirect("WebForm2.aspx");
}
对于 WebForm2.aspx,我们有这样的标记:
<h3>This is WebForm2.aspx</h3>
<br />
<h3 id="myheading" runat="server"></h3>
背后的代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DateTime dt = (DateTime)Session["MyDate"];
myheading.InnerText = dt.ToString("D");
}
}
结果是这样的:
因此,会话对于一个当前用户来说是全局的。因此,每个用户都有自己的会话,如果您希望为给定用户保留一些日期值,那么这是一个不错的选择。
如果您希望有一些适用于所有用户的特殊日期?假设您必须设置一些“季节”或一些适用于所有用户的学校学期日期?
然后我会使用一个数据库,并有一个类似“管理”的页面,您可以在其中设置日期,保存到数据库,然后现在该网站的所有用户都可以从该日期开始工作,当您需要该日期时,您可以必须从数据库中提取该日期。
因此,尚不清楚您是否希望为每个人设置系统范围的日期值,或者您希望每个用户能够设置自己的日期,或者说也许您想为给定的登录用户分配一些日期只要用户登录就保持“正在使用”?