上一篇:runat=server >>
关于上下文(Context)/2(转MS)
[Visual Basic]
<script language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) { If User.Identity.IsAuthenticated Then welcome.Text = "欢迎" + User.Identity.Name Else @# 尚未登录,添加一个指向登录页的链接 welcome.Text = "请登录!" welcome.NavigateUrl = "signin.aspx" End If End Sub</script><asp:HyperLink id="welcome" runat="server" maintainstate="false"></asp:HyperLink>[C#]
<script language="C#" runat="server"> void Page_Load(object sender, EventArgs e) { if (User.Identity.IsAuthenticated) { welcome.Text = "欢迎" + User.Identity.Name; } else { // 尚未登录,添加一个指向登录页的链接 welcome.Text = "请登录!"; welcome.NavigateUrl = "signin.aspx"; } }</script><asp:HyperLink id="welcome" runat="server" maintainstate="false"></asp:HyperLink>Context.Items 简介
希望以上示例可以说明,使用手头仅有的上下文信息编写 Web 应用程序是多么容易。那么,如果可以用同样的方法访问您应用程序独有的一些上下文,不是很好吗?
这就是 Context.Items 集合的用途。它使用在参与处理请求的各部分代码中都可用的方法,保存应用程序的请求特有值。例如,同样一条信息可以用在 Global.asax、ASPX 页、页内的用户控件中,也可以由页调用的业务逻辑使用。
请考虑 IBuySpy Portal(英文)应用程序示例。它使用一个简单的主页 DesktopDefault.aspx 来显示门户内容。显示的内容取决于所选择的选项卡,以及用户(如果已经过身份验证)角色。
图 2:IbuySpy 主页
查询字符串包含正被请求的选项卡的 TabIndedx 和 TabId 参数。在处理请求的整个过程中,一直使用此信息筛选要显示给用户的数据。http://www.ibuyspyportal.com/DesktopDefault.aspx?tabindex=1&tabid=2(英文)
要使用查询字符串值,需要首先确保它是一个有效值,如果不是,则要进行一些错误处理。它并不是一大串代码,但是您真的要在每个使用该值的页和组件中复制它吗?当然不!在 Portal 示例中,甚至更多的地方都涉及到它,因为一旦我们知道了 TabId,就可以预先加载其他信息。
Portal 使用查询字符串值作为参数,以构造一个新的 PortalSettings 对象,并将它添加到 Global.asax 的 BeginRequest 事件的 Context.Items 中。由于在每个请求开始处都执行了开始请求,这使得与该选项卡有关的值在应用程序的所有页和组件中都可用。请求完成后,对象将被自动丢弃 - 非常整齐!
[Visual Basic Global.asax]
Sub Application_BeginRequest(sender As [Object], e As EventArgs) Dim tabIndex As Integer = 0 Dim tabId As Integer = 0 @# 从查询字符串获取 TabIndex If Not (Request.Params("tabindex") Is Nothing) Then tabIndex = Int32.Parse(Request.Params("tabindex")) End If @# 从查询字符串获取 TabID If Not (Request.Params("tabid") Is Nothing) Then tabId = Int32.Parse(Request.Params("tabid")) End If Context.Items.Add("PortalSettings", _New PortalSettings(tabIndex, tabId)) End Sub[C# Global.asax]
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 被访问过的所有地方。
[C# DesktopPortalBanner.ascx]
<%@ 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>\n" + "<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" /> <a href="<%= Request.ApplicationPath %>">Portal 主页</a><span class="Accent"> |</span> <a 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> <a 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>您可以使用 Visual Basic 和 C# 在 http://www.ibuyspy.com(英文)联机浏览并运行 IBuySpy Portal 的完整源文件,或者下载后再运行。
小结
Context 是 ASP.NET 中的又一个“精益求精”的功能。它扩展了 ASP 的已经很不错的上下文支持,以便将两个挂钩添加到 ASP.NET 的新运行时功能中。同时添加了 Context.Items,作为短期值的新状态机制。但对于开发人员,此功能的最大好处是使代码更紧凑,且易于维护,而且此上下文我们都能看懂。
下一篇:关于上下文(Context)/1(转MS) >>
相关文章:
- · 在datagrid中求和(vb.net,c#)
- · ASP.NET中利用SQLXML WEB服务访问XML数据(转)
- · 在DataGrid中经弹出窗口确认后执行操作(删除)。(附在DataGrid中修改,添加记录)详见代码!!
- · 在datagrid中放入一个DropDownList(忘了这个问题在那里看到的了CSDN or There)
- · 简单的动态加载用户控件的方法
- · 关于如何 确认删除的另外一个办法。
- · 掉掉注意了,如何动态加载用户控件(ascx)
- · 给大家一个新的加密方法,C#的。(国外的,只用于学习,支持中文)
- · TO feixr,DataGrid中的Radiobutton
- · 微软.NET战略和ASP.NET简介(1)
- · 微软.NET战略和ASP.NET简介(3)
- · 微软.NET战略和ASP.NET简介(2)
- · 验证控件介绍--RegularExpressionValidator
- · 验证控件介绍--RangeValidator
- · 验证控件介绍--CompareValidator
- · 验证控件介绍--RequiredFieldValidator
- · 解决分页的例子。使用DataSet绑定到DataList实现的。数据库使用我刚才贴的这个。
- · 配置Config.web
- · WebRequest Class
- · asp.net中使用静态变量
- · 利用HttpRequest登录到某个网站,然后获取网站信息的程序示例 [原创]
- · Creating DataGrid Templated Columns Dynamically - Part II(转自DotNetTips)
- · 用ASP.NET写你自己的代码生成器(2)。
- · 用ASP.NET写你自己的代码生成器(3)。
- · mark新官上任,转贴一个DataGrid(增加删除确认和新增记录功能),道贺:)
- · 一个datagrid 删除确认例子
- · 关于ASP.Net不能启动调试的官方解答
- · 在WEB窗体中如何转换页面和结束程序?
- · 关于ASP.Net写注册表权限问题的官方解决方法
- · 动态生成柱状图
- · 一个SDK里做聊天室的例子(2)
- · 网上下载和上传数据(一) Montaque(原作)
- · 一个SDK里做聊天室的例子(1)
- · 网上下载和上传数据(二) Montaque(原作)
- · 有空的时候看看,:)ASP.NET Page Templates
- · VB.NET开发互联网应用
- · vb.net cookie操作
- · Net中如何操作IIS(原理篇)
