步步為營-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 ...
随机推荐
- YOLOv1
学习资料: https://blog.paperspace.com/tag/series-yolo/ https://blog.csdn.net/u014380165/article/details/ ...
- ActiveMQ使用
一.Windows安装ActiveMQ 1.下载解压 2.启动服务 二.Linux安装ActiveMQ 1.下载解压 2.启动访问 三.队列模式 1.创建maven项目 2.生产者 3.消费者 四.主 ...
- Alpha 冲刺 (1/10)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:来自双十一的爱 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 Alpha版本的任务细分安排 leangoo ...
- canvas - 钟表
Demo : Demo Demo截图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
- Light OJ 1009
题意: 给你一个二分图, (可能不连通) 求可能多的子集元素个数: 思路: 直接DFS 给二分图染色就有了, 统计联通块中个数, 去最大值相加即可. #include<bits/stdc++.h ...
- 【原创】运维基础之OpenResty(Nginx+Lua)+Kafka
使用docker部署 1 下载 # wget https://github.com/doujiang24/lua-resty-kafka/archive/v0.06.tar.gz# tar xvf v ...
- 异步io模块
'''客户端''' import socket,select #####进行封装,将socket对象和要返回的url,和回调函数进行一下封装 class Httprequest(): def __in ...
- LINUX-redis & mongodb
ubuntu安装redis: apt-get -y install redis-serverubuntu启动redis: /etc/init.d/redis-server restart linux安 ...
- ie.360,qq浏览器这种ie内核浏览器默认阻止弹窗