步步為營-96-MyMVC2
說明:地址欄中的URL還存在一些不足之處

地址欄中最好能是http"www.sss.com/asdf/aaa
1.1 模擬路由的原理:創建Routing文件夾,并添加URLRoutingModule類

1.2:同時添加Route類和RouteTable類


下面主要寫看看路由是如何匹配的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace YK.Simple.Mvc1.Routing
{
public class Route
{
//構造函數
public Route(string url, object defaults, Func<IDictionary<string, object>, IHttpHandler> handler)
{
UrlTemplate = url;
Default = new Dictionary<string, object>();
var defProps = defaults.GetType().GetProperties();
foreach (var item in defProps)
{
Default.Add(item.Name, item.GetValue(defaults));
}
this.GetRouteHandler = handler;
}
//{controller}/{action}
public string UrlTemplate { get; set; }
//new {controller="Home",action="Index"}
public IDictionary<string, object> Default { get; set; } // public IHttpHandler RouteHandler { get; set; }
//public Func<IHttpHandler> GetRouteHandler { get; set; }
public Func<IDictionary<string,object>, IHttpHandler> GetRouteHandler { get; set; } //讓路由規則主動匹配一個url,輸出一個包含路由對象的字典表
public bool MatchRoute(string requestUrl, out IDictionary<string, object> routeDate)
{
//this.urlTemplate and requestUrl
//"{controller}/{action}" and "sdfs/AsBb" routeDate = new Dictionary<string, object>();
//為路由對象添加默認值
foreach (var item in this.Default)
{
routeDate.Add(item.Key, item.Value);
}
var requestUrlItems = requestUrl.Split('/');//{"sdfs","AsBb"}
var urlTemplates = this.UrlTemplate.Split('/'); //{"{controller}","{action}"}
if (requestUrlItems.Length != urlTemplates.Length)
{
return false;
} int ruCount = requestUrlItems.Length;
//格式匹配成功,開始匹配每一個元素
for (int i = ; i < ruCount; i++)
{
var requestUrlItem = requestUrlItems[i]; //"sdfs"
var urlTemplateItem = urlTemplates[i]; //"{controller}"
if (urlTemplateItem.StartsWith("{") && urlTemplateItem.EndsWith("}"))
{
var key = urlTemplateItem.Trim("{}".ToArray()); //"controller"
//判斷字典表中是否包含此對象
if (routeDate.ContainsKey(key))
{
routeDate[key] = requestUrlItem;
}
else
{
routeDate.Add(key, requestUrlItem);
}
}
else
{
//如果是"hello/{action}"這種形式,不是佔位符則需要進行強匹配
if (!urlTemplateItem.Equals(requestUrlItem, StringComparison.InvariantCultureIgnoreCase))
{
routeDate.Clear();
//該位置沒有匹配成功
return false;
}
} }
return true; } }
}
1.3 在路由表中 添加匹配路由的方法

1.4 在MVC文件夾下添加RouteExt擴展方法用於獲取Handler

其中用到了一個類型需要自定義一下

這時候再來看global文件

1.5 注意此時在擴展方法中是通過new MVCHandler()的方法創建的會出現資源沒有釋放的bug,這時候通過委託來實現

同時修改擴展方法


進一步修改,將路由數據通過參數傳入




下一步處理器中PR方法的寫法

最後配置一下config文件

運行效果:

步步為營-96-MyMVC2的更多相关文章
- 步步為營-97-MyMVC3
說明: 解決另外一個不合理之處:通過控制器完成處理 1:在mvc文件夾下面添加一個工廠類文件DefaultControllerFactory 1.2進一步升級為抽象工廠 2 下一步如何規範Contro ...
- 步步為營-95-MyMVC 1.0
說明:通過自己編寫MyMVC以便於對MVC內容實現機制有更深刻的認識 1.1:創建MyMVC項目,刪除無關引用,只保留system 和 system.web.同時該項目中以後添加一些文件后也要刪除無關 ...
- 步步為營-98-MyAPI
1 通过NuGet程序管理包添加 Microsoft Asp.Net webAPI 2.2 的引用 2 添加两个文件夹Controllers和Models 2.1 在本地模拟数据库,所以在Model ...
- From COM to COM 侯捷 1998.06.12
摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. ...
- 超时空英雄传说2复仇魔神完全攻略&秘技
╓─╥───────────────────────────────────────────────────╥─╖ ║ ║ 超 時 空 英 雄 傳 說 2 ║ ║ ║ ║ --復 仇 魔 神-- ║ ...
- H TC並沒有成為下一個摩托羅拉或諾基亞。
關於2014年第四季度,H T C在三季度財報說明中提到,“年度旗艦H T CO ne(M 8)與中端機型H T C D esire系列在競爭日趨激烈的智能手機市場保持穩定的銷售,市占率有所提升,延續 ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- 修練營ASP.NET]淺談多層式架構 (Multi Tiers)
從需求談起 我們舉個小例子來理解一般的方式與多層的方式有何不同 假設:我需要顯示最近三個月內,所有營業員的銷售金額成績排名 一般的做法: 在一個畫面中,拉個GridView,一個SqlDataSouc ...
随机推荐
- 关于Vue的两层for循环
vue的核心功能是for循环,双层for循环的场景也是比较常见. <script type="text/javascript"> var vm = new Vue({ ...
- dubbo源码分析12——服务暴露3_doExportUrls()方法分析
本文紧接上文,doExportUrls()方法位于ServiceConfig类中,代码入口如下: private void doExportUrls() { List<URL> regis ...
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代 ...
- 游记-NOIP2018
Day -3 受蛊惑跑到理工大去试机,意外发现home里的noilinux账户下有个压缩包,而且还试对了密码,怀着 激动 紧张的心情,打开来看,里面写着 (写出来我就会被禁赛了): asdfasdra ...
- 022_nginx常用模块之ngx_http_upstream_check_module
ngx_http_upstream_check_module 该模块可以为Tengine提供主动式后端服务器健康检查的功能. 该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选 ...
- 如何在eclipse中对项目进行重新编译
有时由于eclipse异常关闭,当我们重启Eclipse,在启动项目时,会报错,说:ClassNotFound类似的错误,引起这种问题的原因可能是由于,Eclipse异常关闭引起的. 解决:在一个项目 ...
- 【原创】大叔经验分享(40)hdfs关闭kerberos
hadoop.security.authentication: Kerberos -> Simple hadoop.security.authorization: true -> fals ...
- python 安装mysql报错
原 安装Python mysqlclient出现“OSError: mysql_config not found”错误 2016年06月01日 12:15:11 wangtaoking1 阅读数:11 ...
- RedHat Linux关闭防火墙的命令
获得root 控制权限.在“#”下操作. 查看防火墙状态. systemctl status firewalld 临时关闭防火墙命令.重启电脑后,防火墙自动起来. systemctl stop fir ...
- python第一天,编写用户接口
作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码 #!/usr/bin/env python #-*- coding:utf-8 -*- #created b ...