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

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
T
The Blog of Author Tim Ferriss
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
爱范儿
爱范儿
GbyAI
GbyAI
H
Help Net Security
I
InfoQ
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
A
Arctic Wolf
Know Your Adversary
Know Your Adversary
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tor Project blog
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园_首页
G
GRAHAM CLULEY
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
D
Docker
Security Latest
Security Latest
I
Intezer
有赞技术团队
有赞技术团队
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 俩醒叁醉

ASP.NET MVC 4 WebAPI. Support Areas in HttpControllerSelector SQL2000安装问题(转) sql server 2008安装需要一直重启。但重启后又没有达到效果。 为数据库中所有的用户数据表生成分页存储过程 SQL 2005 字段备注获取 __doPostBack方法解析 如何在三个月掌握三年的经验(转载&&笔记) jQuery Ajax的使用 JQuery资源网站 Cookie跨域、虚拟目录 深入分析跨域cookie的问题 CnBlogsDotText使用实例 轻松搭建博客平台-开源ASP.NET 博客Subtext 的安装 表达式目录树(源MSDN) Web 2.0 编程思想:16条法则 Control Adapter 以下代码提供查询数据库中是否存在某个值 MVC Controllers和Forms验证 CSharp——Lambda 表达式
URL Routing
俩醒叁醉 · 2009-03-15 · via 博客园 - 俩醒叁醉

URL Routing模型是用来将浏览器输入的请求(requests)映射为MVC controller actions。

1、使用默认的Route表

当你创建ASP.NET MVC应用程序时,就已经配置为使用URL Routing的应用程序。URL Routing创建于两个地方。

一、在Web.config启用URL Routing。在Web.config文件中存在4个和Routing关联的sections,system.web.httpModules 、system.web.httpHandlers 、system.webserver.modules、 和system.webserver.handlers。

二、Route表创建于Global.asax文件中

 public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }
        protected void Application_Start(){ RegisterRoutes(RouteTable.Routes);}
    }
对于这里参数如果不为空时,可以对应Action:Index(int id)和Index()。但是如果Action为:Index(int id)则传入的参数不能为空。
2、自定义URL Routing
创建一个匹配任何以/Archive/开头的Request的Route:
  public static void RegisterRoutes(RouteCollection routes)
  {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     routes.MapRoute(
          "blog",                       //自定义route必须出现在default之前,否则它不会被调用
          "Archive/{entryDate}",        //匹配任何以'/Archive/’开头的请求
          new { controller = "Archive", action = "Entry" });
     routes.MapRoute(
          "Default",                                              // Route name
          "{controller}/{action}/{id}",                           // URL with parameters
          new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
     );
  }
自定义route必须出现在默认Route之前。
3、MVC的URL Routing实现

ControllerBase类实现了IController接口,而该接口只提供一个方法void Execute(RequestContext)。RequestContext基的构造方法需要的参数类型HttpContextBase和HttpContext很相似。

 public class RequestContext
    {
        public RequestContext(HttpContextBase httpContext, RouteData routeData);
        public HttpContextBase HttpContext { get; }
        public RouteData RouteData { get; }
    }

从这可以看出MVC中URL Routing介入的起始点就在RequestContext类。

    public class RouteData
    {
        public RouteData();
        public RouteData(RouteBase route, IRouteHandler routeHandler);
        public RouteValueDictionary DataTokens { get; }
        public RouteBase Route { get; set; }
        public IRouteHandler RouteHandler { get; set; }
        public RouteValueDictionary Values { get; }
        public string GetRequiredString(string valueName);
    }

RouteBase 类:

    public abstract class RouteBase
    {
        protected RouteBase();
        public abstract RouteData GetRouteData(HttpContextBase httpContext);
        public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
    }

要研究透URL Routing,首先就必须清晰上面RouteData类中提到RouteValueDictionary、IRouteHandler。Route初始化时使用RouteValueDictionary来加入默认值及规则到Route中,而IRouteHandler的则提供了一个GetHttpHandler方法来获取用于处理URL的IHttpHandler。其接口定义如下:

  public interface IRouteHandler
    {
        IHttpHandler GetHttpHandler(RequestContext requestContext);
    }

GetHttpHandler输入参数是RequestContext ,而IHttpHandler 的ProcessRequest方法处理的参数则是HttpContext。这也就是URL Routing首次和HttpContext打交道的地方。如是实现这个转换呢?

//在构造方法中传入RequestContext 参数,用以设置页面RequestContext

public class MyPage:IHttpHandler 
{ 
    public RequestContext RequestContext { get; private set; } 
    public MyPage(RequestContext context) 
    { 
            this.RequestContext = context; 
    } 
    #region IHttpHandler  
    public virtual void ProcessRequest(HttpContext context)
	{ //将访问页面如a_b_c_index.aspx转换为a/b/c/index.aspx
		context.Server.Execute(RequestContext.RouteData.Values["page"].ToString().Replace("_","/")+".aspx"); 
	} 
    public bool IsReusable { get { return false; } } 
    #endregion 
}
//实现IRouteHandler 
public class MyRouteHandler : IRouteHandler 
{ 
    #region IRouteHandler  
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
        return new MyPage(requestContext); 
    } 
    #endregion 
}
这样我们就可以在Golbal.asax的Application_Start事件中写如下代码
RouteTable.Routes.Add(new Route("{page}.aspx",new MyRouteHandler()));