关于上下文(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,作为短期值的新状态机制。但对于开发人员,此功能的最大好处是使代码更紧凑,且易于维护,而且此上下文我们都能看懂。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 字符串
, context
, request
, tabindex
, tab字符c#
, User.Identity
, 上下文
tabindex功能
context上下文、context上下文 详解、java context上下文、docker context上下文、omnifocus2 上下文,以便于您获取更多的相关知识。

时间: 2024-10-07 08:57:14

关于上下文(Context)/2(转MS)的相关文章

强悍的上下文Context

在一个框架中,许多地方都要用到上下文(Context),可以说上下文的实现是否到位,直接关系到开发的便捷性及访问效率. 什么是上下文呢?上下文可以认为是在访问者和被访问者之间进行信息传递的纽带.一般的,我们函数之间调用时通过函数参数及返回值来做做数据的传入和传出,但是,这样就会出现不同访问之间的参数都是不同的,在程序中访问的时候,这当然没有问题.但是对于框架来说,它事件不知道你要用什么方式调用,提供的函数及返回值是什么也不知道,这个时候一般来说,会提供一个上下文(Context)来提供数据传入和

Javascript的“上下文”(context)

一:JavaScript中的"上下文"指的是什么 百科中这样定义: 上下文是从英文context翻译过来,指的是一种环境. 在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境. 在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等.又比如计算机技术中,相对于进程而言,上下文就是进程执行时的环境. 具体来说就是各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.   JavaScript的执行上下文的理解是一

笔记 - Android - 6.上下文Context API

Context API:          File getFileDir():返回/data/data/应用程序包名/files 目录(应用程序的files目录)     File getCacheDir():返回/data/data/应用程序包名/cache 目录(应用缓存目录)          ------------          FileOutputStream openFileOutput(String name, int mode):创建一个输出流对象         > n

Javascript 中的上下文,我的认识的三个阶段

js 中的 上下文 Context,可以说是一个,你即使不知道,没听过,也不影响你继续写 js 代码的一个概念.但是,它又确确实实是无所不在的一个东西,是的,无所不在. 从我自己的经验来看,对上下文的认识,算是分成了三个阶段,每一个阶段,都让我从外在的表现中,理解了一些更本质上的东西. 第一阶段,不知 我最开始接触 js 的时候,看到了它的 new ,看到了它的 this ,很自然地会把 js 和其它的一些 OOP 语言等同起来看待,并且,好像,也是这么回事.比如: var Class = fu

用户空间与内核空间,进程上下文与中断上下文[总结]

1.前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文.看着很熟悉,半天又说不出到底是怎么回事,有什么区别.看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解. 2.用户空间与内核空间 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保

基于 TensorFlow 的上下文机器人

本文讲的是基于 TensorFlow 的上下文机器人, 原文地址:Contextual Chatbots with Tensorflow 原文作者:gk_ 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO/contextual-chat-bots-with-tensorflow.md 译者:edvardhua 校对者:lileizhenshuai, jasonxia23 基于 TensorFlow 的上下

final-Andoid如何获取string字符串,在一个类中没有context

问题描述 Andoid如何获取string字符串,在一个类中没有context 我们都知道,Android中在一个Activity或是service中可以用this.getString(R.string,test);来获取字符串,但如果这样呢? publicclass myTestClass{ public static final String MYTEST = "this is a test"; //如果这个字符串是在string.xml中,该如何获取该值 //this.getSt

jQuery技术内幕:深入解析jQuery架构设计与实现原理. 3.4 Sizzle( selector, context, results, seed )

3.4 Sizzle( selector, context, results, seed ) 函数Sizzle( selector, context, results, seed )用于查找与选择器表达式selector匹配的元素集合.该函数是选择器引擎的入口. 函数Sizzle( selector, context, results, seed )执行的6个关键步骤如下: 1)解析块表达式和块间关系符. 2)如果存在位置伪类,则从左向右查找: a.?查找第一个块表达式匹配的元素集合,得到第一个

Linux Context , Interrupts 和 Context Switching 说明【转】

转自:http://blog.csdn.net/tianlesoftware/article/details/6461207 一. 进程Context 定义        当一个进程在执行时, CPU的所有寄存器中的值.进程的状态以及堆栈中的内容,比如各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.这些信息被称为该进程的上下文(Context).          一个进程的Context可以分为三个部分:用户级上下文.寄存器上下文以及系统级上下文:        (1)用户级

.NET面向上下文、AOP架构模式(实现)

1.上下文Context.面向切面编程AOP模型分析 在本人的.NET面向上下文.AOP架构模式(概述)一文中,我们大概了解了上下文如何辅助对象在运行时的管理.在很多时候我们急需在运行时能把对象控制在一定的逻辑范围内,在必要的时候能让他们体现出集中化的概念,如人群.车辆.动物等等.而Context与AOP有着密切的联系,Context表示逻辑抽象的范围而AOP描述了在这个逻辑范围内如何进行控制.其实这两者都是设计模式外的设计模式,与具体的技术实现无关.[王清培版权所有,转载请给出署名] 那么Co