⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stateoverview.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 2 页
字号:
</ul>

下面的示例假设状态服务在 Web 服务器所在的同一台计算机(“localhost”)上运行,并且使用默认端口 (42424):
<div class="code"><pre>
&lt;sessionState
  mode="StateServer"
  stateConnectionString="tcpip=localhost:42424"
/&gt;
</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 + -