步步為營-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 ...
随机推荐
- TextView 文字拼接
//引用文字 String testStr = (getResources().getString(R.string.test_str,"<font color='#ff0000'&g ...
- Linux下的压缩和解压缩命令gzip/gunzip
作者:邓聪聪 Linux下的压缩和解压缩命令——gzip/gunzip yum -y install zip gzip (--安装压缩工具) gzip命令 gzip命令用来压缩文件.gzip是个使用广 ...
- python3+selenium框架设计08-进一步实现POM
之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...
- 设计模式C++学习笔记之十六(Observer观察者模式)
16.1.解释 概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. main(), IObservable,被观察者接口 CHanFei ...
- 神经网络中的偏置项b到底是什么?
原文地址:https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408 前言 很多人不明白为什么要在神经网络.逻 ...
- 通过flask实现web页面简单的增删改查
通过flask实现web页面简单的增删改查 # 1.后台程序falsk_web01.py #coding:utf-8 from flask import Flask,render_template,r ...
- Redis高级特性介绍及实例分析
转自:http://www.jianshu.com/p/af7043e6c8f9 Redis基础类型回顾 String Redis中最基本,也是最简单的数据类型.注意,VALUE既可以是简单的St ...
- Linux命令之chmod、chown
一.chmod命令 chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. ...
- Android 应用防止被二次打包指南
前言 “Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包.不管从性能.用户体验.外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不 ...
- IOS 常遇到的报错警告 以及 解决办法
1. This application is modifying the autolayout engine from a background thread, which can lead to ...