說明:地址欄中的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的更多相关文章

  1. 步步為營-97-MyMVC3

    說明: 解決另外一個不合理之處:通過控制器完成處理 1:在mvc文件夾下面添加一個工廠類文件DefaultControllerFactory 1.2進一步升級為抽象工廠 2 下一步如何規範Contro ...

  2. 步步為營-95-MyMVC 1.0

    說明:通過自己編寫MyMVC以便於對MVC內容實現機制有更深刻的認識 1.1:創建MyMVC項目,刪除無關引用,只保留system 和 system.web.同時該項目中以後添加一些文件后也要刪除無關 ...

  3. 步步為營-98-MyAPI

    1 通过NuGet程序管理包添加  Microsoft Asp.Net webAPI 2.2 的引用 2 添加两个文件夹Controllers和Models 2.1 在本地模拟数据库,所以在Model ...

  4. From COM to COM 侯捷 1998.06.12

    摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. ...

  5. 超时空英雄传说2复仇魔神完全攻略&秘技

    ╓─╥───────────────────────────────────────────────────╥─╖ ║ ║ 超 時 空 英 雄 傳 說 2 ║ ║ ║ ║ --復 仇 魔 神-- ║ ...

  6. H TC並沒有成為下一個摩托羅拉或諾基亞。

    關於2014年第四季度,H T C在三季度財報說明中提到,“年度旗艦H T CO ne(M 8)與中端機型H T C D esire系列在競爭日趨激烈的智能手機市場保持穩定的銷售,市占率有所提升,延續 ...

  7. 一步步教你读懂NET中IL(附带图)

    一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...

  8. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  9. 修練營ASP.NET]淺談多層式架構 (Multi Tiers)

    從需求談起 我們舉個小例子來理解一般的方式與多層的方式有何不同 假設:我需要顯示最近三個月內,所有營業員的銷售金額成績排名 一般的做法: 在一個畫面中,拉個GridView,一個SqlDataSouc ...

随机推荐

  1. ListBox滚动条 刷新列表之后 指定位置(置顶或滚动到最后)

    参数ObservableCollection<T>类型 滚动条在最上 ListBox.ScrollIntoView(ListBoxOC[0]);滚动条在最下 ListBox.ScrollI ...

  2. Python学习笔记-条件语句

    学习代码如下 flag=False name = raw_input("请输入:"); if name == '羊爸爸': flag=True print 'Welcome Hom ...

  3. 20165231 2017-2018-2 《Java程序设计》第5周学习总结

    教材学习内容总结 第七章 内部类 在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类. 内部类的类体中不可以声明类变量和类方法.外嵌类的类体中可以用内部类声明对象,作为外嵌 ...

  4. 为什么要重写equals和hashcode方法

    equals hashcode  当新建一个java类时,需要重写equals和hashcode方法,大家都知道!但是,为什么要重写呢? 需要保证对象调用equals方法为true时,hashcode ...

  5. 虚拟化之kvm --(vnc控制台)

    作者:邓聪聪 随着日益不同的需求增多,为了满足主机供求,get到这一招虚拟化技术,以增加点见识! 1.使用yum安装: yum -y install qemu-kvm libvirt python-v ...

  6. HTTP协议07-通用首部字段

    通用首部字段 通用首部字段是指,请求报文和响应报文双方都会使用的首部. 1)Cache-Control 通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制. 指令的参数可以多选, ...

  7. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

  8. 解决:error LNK2026: 模块对于 SAFESEH 映像是不安全的

    用vs2017编译比较老的vc++项目,出现这个错误,解决方案如下: 1.打开该项目的[属性]对话框, 2.点击[链接器]选项, 3.点击[命令行]选项, 4.将 [/SAFESEH:NO ]键入[其 ...

  9. vuex之 mapState, mapGetters, mapActions, mapMutations 的使用

    一.介绍 vuex里面的四大金刚:State, Mutations,Actions,Getters (上次记得关于vuex笔记 http://www.cnblogs.com/adouwt/p/8283 ...

  10. Android App增量升级

    移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力.说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面, ...