📄 stateoverview.aspx
字号:
</ul>
下面的示例假设状态服务在 Web 服务器所在的同一台计算机(“localhost”)上运行,并且使用默认端口 (42424):
<div class="code"><pre>
<sessionState
mode="StateServer"
stateConnectionString="tcpip=localhost:42424"
/>
</pre></div>
注意,如果对上面的示例使用此设置,可以重置 Web 服务器(在命令行上输入 <code>iisreset</code>),会话状态值将保持。
<p>
<!--BEGIN SECTION--> <a name="cookies"><span class="subhead">使用客户端 Cookie</span>
<p>
下面的示例说明如何使用客户端 Cookie 存储易失的用户首选项。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies1/CS/cookies1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies1/cookies1.src"
Icon="/quickstart/aspplus/images/cookies1.gif"
Caption="C# Cookies1.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies1/VB/cookies1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies1/cookies1.src"
Icon="/quickstart/aspplus/images/cookies1.gif"
Caption="VB Cookies1.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies1/JS/cookies1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies1/cookies1.src"
Icon="/quickstart/aspplus/images/cookies1.gif"
Caption="JScript Cookies1.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一。Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一起发送到服务器。浏览器对 Cookie 的大小有限制,因此,只有不超过 4096 字节才能保证被接受。
<p>
当数据存储在客户端时,文件 cookies1.aspx 中的 <b>Page_Load</b> 方法检查客户端是否已发送了 Cookie。如果没有,则创建并初始化一个新的 Cookie 并将其存储在客户端:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected void Page_Load(Object sender, EventArgs e) {
if (Request.Cookies["preferences1"] == null) {
HttpCookie cookie = new HttpCookie("preferences1");
cookie.Values.Add("ForeColor", "black");
...
Response.AppendCookie(cookie);
}
}
</Tab>
<Tab Name="VB">
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Request.Cookies("preferences1") = Null Then
Dim cookie As New HttpCookie("preferences1")
cookie.Values.Add("ForeColor", "black")
...
Response.AppendCookie(cookie)
End If
End Sub
</Tab>
<Tab Name="JScript">
protected function Page_Load(sender:Object, e:EventArgs) : void {
if (Request.Cookies("preferences1") == null) {
var cookie:HttpCookie = new HttpCookie("preferences1");
cookie.Values.Add("ForeColor", "black");
...
Response.AppendCookie(cookie);
}
}
</Tab>
</Acme:TabControl><p>
<p>
在同一页上,再次使用 <b>GetStyle</b> 方法提供存储在 Cookie 中的个别值:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected String GetStyle(String key) {
HttpCookie cookie = Request.Cookies["preferences1"];
if (cookie != null) {
switch (key)
{
case "ForeColor" : return cookie.Values["ForeColor"]; break;
...
}
}
return "";
}
</Tab>
<Tab Name="VB">
Protected Function GetStyle(key As String) As String
Dim cookie As HttpCookie = Request.Cookies("preferences1")
If cookie <> Null Then
Select Case key
Case "ForeColor"
Return(cookie.Values("ForeColor"))
Case ...
End Select
End If
Return("")
End Function
</Tab>
<Tab Name="JScript">
protected function GetStyle(key:String) : String {
var cookie:HttpCookie = Request.Cookies("preferences1");
if (cookie != null) {
switch (key)
{
case "ForeColor" : return cookie.Values("ForeColor"); break;
...
}
}
return "";
}
</Tab>
</Acme:TabControl><p>
<p>
打开 cookies1.aspx 页并修改首选项以验证此示例是否运行。在另一窗口中打开此页,它应获得新的首选项。关闭所有浏览器窗口,然后再次打开 cookies1.aspx 页。这应删除临时 Cookie 并还原默认首选项值。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies2/CS/cookies2.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies2/cookies2.src"
Icon="/quickstart/aspplus/images/cookies2.gif"
Caption="C# Cookies2.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies2/VB/cookies2.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies2/cookies2.src"
Icon="/quickstart/aspplus/images/cookies2.gif"
Caption="VB Cookies2.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/cookies2/JS/cookies2.aspx"
ViewSource="/quickstart/aspplus/samples/apps/cookies2/cookies2.src"
Icon="/quickstart/aspplus/images/cookies2.gif"
Caption="JScript Cookies2.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
若要使 Cookie 在会话之间持久,必须将 <b>HttpCookie</b> 类上的 <b>Expires</b> 属性设置为将来的某个日期。除了 <b>Cookie.Expires</b> 的赋值,下列自定义 .aspx 页上的代码与上一个示例相同:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected void Submit_Click(Object sender, EventArgs e) {
HttpCookie cookie = new HttpCookie("preferences2");
cookie.Values.Add("ForeColor",ForeColor.Value);
...
cookie.Expires = DateTime.MaxValue; // Never Expires
Response.AppendCookie(cookie);
Response.Redirect(State["Referer"].ToString());
}
</Tab>
<Tab Name="VB">
Protected Sub Submit_Click(sender As Object, e As EventArgs)
Dim cookie As New HttpCookie("preferences2")
cookie.Values.Add("ForeColor",ForeColor.Value)
...
cookie.Expires = DateTime.MaxValue ' Never Expires
Response.AppendCookie(cookie)
Response.Redirect(State("Referer").ToString())
End Sub
</Tab>
<Tab Name="JScript">
protected function Submit_Click(sender:Object, e:EventArgs) : void {
var cookie:HttpCookie = new HttpCookie("preferences2");
cookie.Values.Add("ForeColor",ForeColor.Value);
...
cookie.Expires = DateTime.MaxValue; // Never Expires
Response.AppendCookie(cookie);
Response.Redirect(State("Referer").ToString());
}
</Tab>
</Acme:TabControl><p>
修改值、关闭所有浏览器窗口并再次打开 cookies2.aspx,以验证此示例是否运行。窗口仍应显示自定义的值。
<p>
<!--BEGIN SECTION--> <a name="viewstate"><span class="subhead">使用视图状态</span>
<p>
此示例说明如何使用 <b>ViewState</b> 属性存储请求特定的值。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/pagestate/CS/pagestate1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/pagestate/pagestate1.src"
Icon="/quickstart/aspplus/images/pagestate1.gif"
Caption="C# PageState1.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/pagestate/VB/pagestate1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/pagestate/pagestate1.src"
Icon="/quickstart/aspplus/images/pagestate1.gif"
Caption="VB PageState1.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/apps/pagestate/JS/pagestate1.aspx"
ViewSource="/quickstart/aspplus/samples/apps/pagestate/pagestate1.src"
Icon="/quickstart/aspplus/images/pagestate1.gif"
Caption="JScript PageState1.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
ASP.NET 为每个控件提供视图状态的服务器端注记。控件可以使用类 <b>StateBag</b> 的一个实例上的 <b>ViewState</b> 属性,在请求之间保存它的内部状态。<b>StateBag</b> 类提供词典样式的接口来存储与字符串键关联的对象。
<p>
文件 pagestate1.aspx 显示一个可见的面板并使用键 <b>PanelIndex</b> 在该页的视图状态下存储它的索引:
<p>
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected void Next_Click(Object sender, EventArgs e ) {
String PrevPanelId = "Panel" + ViewState["PanelIndex"].ToString();
ViewState["PanelIndex"] = (int)ViewState["PanelIndex"] + 1;
String PanelId = "Panel" + ViewState["PanelIndex"].ToString();
...
}
</Tab>
<Tab Name="VB">
Protected Sub Next_Click(sender As Object, e As EventArgs)
Dim PrevPanelId As String = "Panel" + ViewState("PanelIndex").ToString()
ViewState("PanelIndex") = CType(ViewState("PanelIndex") + 1, Integer)
Dim PanelId As String = "Panel" + ViewState("PanelIndex").ToString()
...
End Sub
</Tab>
<Tab Name="JScript">
protected function Next_Click(sender:Object, e:EventArgs) : void {
var PrevPanelId:String = "Panel" + ViewState("PanelIndex").ToString();
ViewState("PanelIndex") = int(ViewState("PanelIndex") + 1);
var PanelId:String = "Panel" + ViewState("PanelIndex").ToString();
...
}
</Tab>
</Acme:TabControl><p>
注意,如果在多个浏览器窗口中打开该页,每个浏览器窗口最初将显示此名称面板。每个窗口可以独立地在面板之间定位。
<h4><a name="summary">本节小结</a></h4>
<ol>
<li>使用应用程序状态变量存储很少修改但经常使用的数据。
<li>使用会话状态变量存储特定于某个会话或用户的数据。数据全部存储在服务器上。这种方法适于短期的、大量的或敏感的数据。
<li>将少量易失数据存储在非持久性 Cookie 中。数据存储在客户端,在每次请求时发送到服务器,并在客户端结束执行时失效。
<li>将少量非易失数据存储在持久性 Cookie 中。数据存储在客户端直到失效,并在每次请求时发送到服务器。
<li>将少量请求特定的数据存储在视图状态中。数据从服务器发送到客户端并返回。
</ol>
<p>
<!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -