代码改变世界

ASP.NET状态管理之(暂存状态HttpContext.Items)

2011-09-27 18:33  elivsit  阅读(299)  评论(0编辑  收藏  举报

ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items

暂存状态就是利用HttpContext.Items属性来存放数据

MSDN中HttpContext.Items属性的解释是这样的:获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值

HttpContext.Items属性中可以存放任何类型数据,无论这个属性中存放什么数据,都会在请求处理结束后自动清除,这就是暂存状态,数据的存放时间非常短.


//例如:
//我们有一页面A.ASPX,有一按钮ID:Submit,点按钮把页面转向b.aspx页面

public void Submit_Click(Object sender, EventArgs E)
{
    SqlConnection myConnection 
= new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
    SqlDataAdapter myCommand 
= new SqlDataAdapter("select * from Authors", myConnection);
    DataSet ds 
= new DataSet();
    myCommand.Fill(ds, 
"Authors");
    
//把数据放入暂存中
    Context.Items["MyData"=ds;
    Server.Transfer(b.aspx);    
}



//b.aspx页面中

public void Page_Load(Object sender, EventArgs E)
  
{
    
if (!IsPostBack)
    
{
    
//取得暂存数据
    DataSet ds=(DataSet)Context.Items["MyData"];
    
//其它数据过程
    }

  }



在ibuyspyportal中我们也看到了此功能的使用:

查询字符串包含正被请求的选项卡的 TabIndedx 和 TabId 参数。在处理请求的整个过程中,一直使用此信息筛选要显示给用户的数据。
http://www.ibuyspyportal.com/DesktopDefault.aspx?tabindex=1&tabid=2
要使用查询字符串值,需要首先确保它是一个有效值,如果不是,则要进行一些错误处理。它并不是一大串代码,但是您真的要在每个使用该值的页和组件中复制它吗?当然不!在 Portal 示例中,甚至更多的地方都涉及到它,因为一旦我们知道了 TabId,就可以预先加载其他信息。

Portal 使用查询字符串值作为参数,以构造一个新的 PortalSettings 对象,并将它添加到 Global.asax 的 BeginRequest 事件的 Context.Items 中。由于在每个请求开始处都执行了开始请求,这使得与该选项卡有关的值在应用程序的所有页和组件中都可用。请求完成后,对象将被自动丢弃


void Application_BeginRequest(Object sender, EventArgs e)
 

     
  
int tabIndex = 0
  
int tabId = 0

  
// 从查询字符串获取 TabIndex 

  
if (Request.Params["tabindex"!= null{        
    tabIndex 
= Int32.Parse(Request.Params["tabindex"]); 
  }
 
         
  
// 从查询字符串获取 TabID 

  
if (Request.Params["tabid"!= null{        
    tabId 
= Int32.Parse(Request.Params["tabid"]); 
  }
 

  Context.Items.Add(
"PortalSettings"new PortalSettings(tabIndex, tabId)); 
}
 



DesktopPortalBanner.ascx 用户控件从 Context 请求 PortalSetting 的对象,以访问 Portal 的名称和安全设置。事实上,此模块是操作中的 Context 的一个典型综合示例。为阐明这一点,我已将代码进行了一些简化,并用粗体标记了 HTTP 或应用程序特定的 Context 被访问过的所有地方。

<%@ Import Namespace="ASPNetPortal" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 

<script language="C#" runat="server"> 

  public 
int     tabIndex; 
  public bool     ShowTabs 
= true
  protected String  LogoffLink 
= ""

  
void Page_Load(Object sender, EventArgs e) 

    
// 从当前上下文获取 PortalSettings 
 PortalSettings portalSettings = 
(PortalSettings) Context.Items[
"PortalSettings"]; 

    
// 动态填充门户站点名称 
    siteName.Text = portalSettings.PortalName; 

    
// 如果用户已登录,自定义欢迎信息 
    if (Request.IsAuthenticated == true
     
      WelcomeMessage.Text 
= "欢迎" + 
Context.User.Identity.Name 
+ "!<" + 
"span class=Accent" + ">|<" + "/span" + ">"

      
// 如果身份验证模式为 Cookie,则提供一个注销链接 
      if (Context.User.Identity.AuthenticationType == "Forms"
        LogoffLink 
= "<" + "span class="Accent">|</span> " + 
"<a href=" + Request.ApplicationPath + 
"/Admin/Logoff.aspx class=SiteLink> 注销" + 
"</a>"
      }
 
    }
 

    
// 动态显示门户选项卡条 
    if (ShowTabs == true

      tabIndex 
= portalSettings.ActiveTab.TabIndex; 

      
// 生成要向用户显示的选项卡列表                  
      ArrayList authorizedTabs = new ArrayList(); 
      
int addedTabs = 0

      
for (int i=0; i < portalSettings.DesktopTabs.Count; i++
       
        TabStripDetails tab 
= 
(TabStripDetails)portalSettings.DesktopTabs[i]; 

        
if (PortalSecurity.IsInRoles(tab.AuthorizedRoles)) 
          authorizedTabs.Add(tab); 
        }
 

        
if (addedTabs == tabIndex) 
          tabs.SelectedIndex 
= addedTabs; 
        }
 

        addedTabs
++
      }
      

      
// 用已授权的选项卡填充页顶部的选项卡 
//
 列表 
      tabs.DataSource = authorizedTabs; 
      tabs.DataBind(); 
    }
 
  }
 

</script> 
<table width="100%" cellspacing="0" class="HeadBg" border="0"> 
  
<tr valign="top"> 
    
<td colspan="3" align="right"> 
      
<asp:label id="WelcomeMessage" runat="server" /> 
      
<href="<%= Request.ApplicationPath %>">Portal 主页</a> 
<span class="Accent"> |</span> 
<href="<%= Request.ApplicationPath %>/Docs/Docs.htm"> 
        Portal 文档
</a> 
      
<%= LogoffLink %> 
         
    
</td> 
  
</tr> 
  
<tr> 
    
<td width="10" rowspan="2"> 
        
    
</td> 
    
<td height="40"> 
      
<asp:label id="siteName" runat="server" /> 
    
</td> 
    
<td align="center" rowspan="2"> 
     
    
</td> 
  
</tr> 
  
<tr> 
    
<td> 
      
<asp:datalist id="tabs" runat="server"> 
        
<ItemTemplate> 
           
<href='<%= Request.ApplicationPath %> 
/DesktopDefault.aspx?tabindex=
<%# Container.ItemIndex %>&tabid
<%# ((TabStripDetails) Container.DataItem).TabId %>'> 
<%# ((TabStripDetails) Container.DataItem).TabName %> 
</a>  
        
</ItemTemplate> 
        
<SelectedItemTemplate> 
           
         
<span class="SelectedTab"> 
<%# ((TabStripDetails) Container.DataItem).TabName %> 
</span>  
        
</SelectedItemTemplate> 
      
</asp:datalist> 
    
</td> 
  
</tr> 
</table>