步步為營-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 ...
随机推荐
- Docker安装MySQL
查看镜像 docker search mysql 拉取镜像 docker pull mysql:5.7 说明:5.7为指定下载的版本,可以更换其他版本 运行镜像 docker run --name m ...
- 统计分析与R软件-chapter2-6
2.6 列表与数据框 2.6.1 列表 1.列表的构造 列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型,元素本身允许是其他复杂数据类型, ...
- mysql死锁-查询锁表进程-分析锁表原因【转】
查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然 ...
- Python os.walk文件遍历用法【转】
python中os.walk是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 1.载入 要使用os.walk,首先要载入该函数 可以使用以下两种方法 import os ...
- python 字典不区分大小写工具类
# -*- coding: utf-8 -*- # @Time : 2018/12/20 4:28 PM # @Author : cxa # @File : DictHelper.py # @Soft ...
- python3+requests库框架设计01-自动化测试框架需要什么?
什么是自动化测试框架 关于自动化测试框架的定义有很多,在我大致理解下就是把能实现不同功能的软件组合在一起,实现特定的目的,这就是一个简单的自动化测试框架. 接口自动化测试框架核心无非是选择 一个用来编 ...
- 【转】C++ 11 并发指南一(C++ 11 多线程初探)
引言 C++ 11自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些C++ 11的新特性,算是记录一下自己学到的东西吧,和大家共勉. 相信Linux程序员都用过Pthrea ...
- Linux中OCI开发库的配置
Oracle调用接口(Oracle Call Interface,简称OCI)提供了一组可对Oracle数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取Or ...
- latex中的希腊字母
原文地址:http://blog.csdn.net/xxzhangx/article/details/52778539 希腊字母,我们从小学开始认识它,但对它的读音我依旧靠蒙(说蒙真的感觉好羞愧啊). ...
- 码云 Git No network connection
背景 git,好久没用了都.心血来潮还是赶紧熟悉下吧.果不其然,每次要熟悉或开始一个东西,立马就出现问题.本来好好的环境竟然不行了,搞定后感觉应该是换了网络环境的事.这倒次要,主要让我想起了最初学习g ...