惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
博客园_首页
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
小众软件
小众软件
博客园 - 司徒正美
雷峰网
雷峰网
T
Tailwind CSS Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
罗磊的独立博客
量子位
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog

博客园 - Andrew Yin

数据访问层组件设计以及选型意识流 第四次扩展的讨论 数据访问层组件设计以及选型意识流 第三次封装(极致、极简而不简单) 数据访问层组件设计以及选型意识流 第二次封装以及各种牢骚 数据访问层组件设计以及选型意识流 第一次封装 数据访问层组件设计以及选型意识流 开篇 UTF-8, Unicode, GB2312三种编码方式解析, 深入研究汉字编码 C++中的模板实例:链表模板 一步一步学Ruby系列(二):Ruby中的函数 一步一步学Ruby系列(一):Ruby基础知识 .NET下的AOP: PostSharp 原理分析 AST,DLR,Expression Tree-----------推荐一位牛人的博客! C# 交互式SHELL C#中的 eval System.Web.Routing命名空间代码解析(四) Route解析中用到的实体类,一些以"Segment”为名的类 System.Web.Routing命名空间代码解析(三) RouteCollection类 System.Web.Routing命名空间代码解析(二) Routing类(上) System.Web.Routing命名空间代码解析(一) RouteBase类,RouteData类,RouteValueDictionary类 有关string和Cookie的几个有用的扩展方法 反射加异步,根据枚举值来异步执行方法 操作Enum的一些实用方法
ASP.NET MVC中的各种上下文对象
Andrew Yin · 2008-12-05 · via 博客园 - Andrew Yin

先来个图预览一下:

1.首先是System.Web.Routing下的RequestContext类,代码相当简单,把HttpContextBase和RouteData放在一起就OK了。

Code

关于RouteData,我以后会讲的,现在只需要知道它存储了Route信息,从URL中根据Route规则Map到的参数值都在里面。

2.接着就是ControllerContext类了,这个类很有意思:

using System.Security.Permissions;

namespace System.Web.Mvc
{
    
using System.Web.Routing;

    [AspNetHostingPermission(SecurityAction.LinkDemand, Level 
= AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level 
= AspNetHostingPermissionLevel.Minimal)]
    
public class ControllerContext : RequestContext
    
{
        
protected internal ControllerContext(ControllerContext controllerContext)
            : 
this(GetControllerContext(controllerContext), GetControllerContext(controllerContext).Controller) {}

        
public ControllerContext(HttpContextBase httpContext, RouteData routeData, ControllerBase controller)
            : 
base(httpContext, routeData)
        
{
            
if (controller == nullthrow new ArgumentNullException("controller");
            Controller 
= controller;
        }


        
public ControllerContext(RequestContext requestContext, ControllerBase controller)
            : 
this(
                GetRequestContext(requestContext).HttpContext, GetRequestContext(requestContext).RouteData, controller) 
{}

        
public ControllerBase Controller getprivate set; }

        
internal static RequestContext GetRequestContext(RequestContext requestContext)
        
{
            
if (requestContext == nullthrow new ArgumentNullException("requestContext");
            
return requestContext;
        }


        
internal static ControllerContext GetControllerContext(ControllerContext controllerContext)
        
{
            
if (controllerContext == nullthrow new ArgumentNullException("controllerContext");
            
return controllerContext;
        }

    }

}

其实它也就是在RequestContext的基础上加了个对Controller的引用(当然是对ControllerBase基类的引用)。

它的几个重载的构造函数以及静态方法写得很有意思,值得借鉴。

3.