Routes是如何把URL映射为Action
-请求路由管道
请求管道概述
1.UrlRotingModule视图使用RouteTable里的注册路由当前请求
2.如果匹配成功,则从路由对象生成IRouteHandler对象
3.Routing模块调用IRouteHandler中的GetHandler方法,这一方法返回一个IHttpHandler
4.ProcessRequest对象调用Http handler对象响应
5.在MVC架构中IRouteHandler对象默认是一个MvcRouteHandler对象,它返回的对象是一个MvcHandler对象
路由匹配法则
-routedata
{foo}/{bar}/{baz}
Public Interface IRouteConstraint{
BoolMatch(HttpContextBasehttpContext,
Route route,
string parameterName,
RouteValuedictionaryvalues,
RouteDirectionrouteDirection);
}
routes.MapRoute(“name”,”{controller}”,null,new{httpMethod=new HttpMethonConstraint(“GET”)});
Route扩展
routes.MapResources(“Products”);
描述信息
/Products 显示所有products
/Products/new 生成一个表格用于添加新纪录
/Products/1 显示ID是1的记录
/Products/1/edit 编辑ID是1的记录
public class RestRoute:RouteBase{
public override RouteDataGetRouteData
(HttpContextBasehttpcontext){}
public override VirtualPathDataGetVirtualPath
(RequestContextrequestcontext,
RouteValueDictionaryvalues){}
}
List<Route> _internalRoutes= new List<Route>();
public string Resource { get; private set; }
public RestRoute(string resource)
{
this.Resource= resource;
MapRoute(resource, “index”, “GET”, null);
MapRoute(resource, “create”, “POST”, null);
MapRoute(resource + “/new”, “newitem”, “GET”, null);
MapRoute(resource + “/{id}”, “show”, “GET”, new { id = @”\d+” });
MapRoute(resource + “/{id}”, “update”, “PUT”, new { id = @”\d+” });
MapRoute(resource + “/{id}”, “delete”, “DELETE”, new { id = @”\d+” });
MapRoute(resource + “/{id}/edit”, “edit”, “GET”, new { id = @”\d+” });
}
public void MapRoute(string url, string actionName, string httpMethod,
object constraints)
{
RouteValueDictionaryconstraintsDictionary;if (constraints != null)
{
constraintsDictionary= new RouteValueDictionary(constraints);
}
else
{
constraintsDictionary= new RouteValueDictionary();
}
constraintsDictionary.Add(“httpMethod”, new HttpMethodConstraint(httpMethod));
_internalRoutes.Add(new Route(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{ controller = Resource, action = actionName}),
Constraints = constraintsDictionary
});
}
public override RouteDataGetRouteData(HttpContextBasehttpContext)
{
foreach(varroute in this._internalRoutes)
{
varrvd= route.GetRouteData(httpContext);
if (rvd!= null) return rvd;
}
return null;
}
public override VirtualPathDataGetVirtualPath(RequestContextrequestContext,
RouteValueDictionaryvalues)
{
foreach(varroute in this._internalRoutes)
{
VirtualPathDatavpd= route.GetVirtualPath(requestContext, values);
if (vpd!= null) return vpd;
}
return null;
}
Routes.Add(new RestRoute("Products"));
编辑Routes
Protected void Application_start(){
AreaRegistration.RegisterAllAreas();
RouteTable.Routes.registerRoutes(“~/Config/routes.cs”);
}
using System.Web.Mvc;
using System.Web.Routing;
using EditableRoutesWeb;
// Use this one for Full Trust
public class Routes : IRouteRegistrar
{public void RegisterRoutes(RouteCollectionroutes){
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(“Default”,“{controller}/{action}/{id}”,new {
controller = “Home”,
action = “Index”,
id = ““ });}}
使用Cache监控代码
using System;
using System.Web.Compilation;
using System.Web.Routing;
namespace EditableRoutesWeb{
public static class RouteRegistrationExtensions{
public static void RegisterRoutes(
this RouteCollectionroutes,stringvirtualPath){
ConfigFileChangeNotifier.Listen(
virtualPath, vp=> routes.ReloadRoutes(vp));
}
static void ReloadRoutes(this RouteCollectionroutes, string virtualPath)
{
varassembly = BuildManager.GetCompiledAssembly(virtualPath);
var registrar = assembly.CreateInstance(“Routes”) as IRouteRegistrar;
using(routes.GetWriteLock())
{
routes.Clear();
registrar.RegisterRoutes(routes);
}}}}
怎么知道有改变?
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
namespace EditableRoutesWeb{
public class ConfigFileChangeNotifier{
private ConfigFileChangeNotifier(Action<string> changeCallback)
: this(HostingEnvironment.VirtualPathProvider, changeCallback){}
private ConfigFileChangeNotifier(VirtualPathProvidervpp,
Action<string> changeCallback) {
_vpp= vpp;
_changeCallback= changeCallback;
}
VirtualPathProvider_vpp;
Action<string> _changeCallback;
// When the file at the given path changes, we’ll call the supplied action.
public static void Listen(string virtualPath, Action<string> action) {
varnotifier= new ConfigFileChangeNotifier(action);
notifier.ListenForChanges(virtualPath);
}
void ListenForChanges(string virtualPath) {
// Get a CacheDependencyfrom the BuildProvider, so that we know
// anytime something changes
varvirtualPathDependencies= new List<string>();
virtualPathDependencies.Add(virtualPath);
CacheDependencycacheDependency= _vpp.GetCacheDependency(
virtualPath, virtualPathDependencies, DateTime.UtcNow);
HttpRuntime.Cache.Insert(virtualPath/*key*/,
virtualPath/*value*/,
cacheDependency,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback(OnConfigFileChanged));
}
void OnConfigFileChanged(string key, object value,
ChItRdR) {...
2011-4-17 14:50 danny
-请求路由管道
请求管道概述
1.UrlRotingModule视图使用RouteTable里的注册路由当前请求
2.如果匹配成功,则从路由对象生成IRouteHandler对象
3.Routing模块调用IRouteHandler中的GetHandler方法,这一方法返回一个IHttpHandler
4.ProcessRequest对象调用Http handler对象响应
5.在MVC架构中IRouteHandler对象默认是一个MvcRouteHandler对象,它返回的对象是一个MvcHandler对象
路由匹配法则
-routedata
{foo}/{bar}/{baz}
Public Interface IRouteConstraint{
BoolMatch(HttpContextBasehttpContext,
Route route,
string parameterName,
RouteValuedictionaryvalues,
RouteDirectionrouteDirection);
}
routes.MapRoute(“name”,”{controller}”,null,new{httpMethod=new HttpMethonConstraint(“GET”)});
Route扩展
routes.MapResources(“Products”);
描述信息
/Products 显示所有products
/Products/new 生成一个表格用于添加新纪录
/Products/1 显示ID是1的记录
/Products/1/edit 编辑ID是1的记录
public class RestRoute:RouteBase{
public override RouteDataGetRouteData
(HttpContextBasehttpcontext){}
public override VirtualPathDataGetVirtualPath
(RequestContextrequestcontext,
RouteValueDictionaryvalues){}
}
List<Route> _internalRoutes= new List<Route>();
public string Resource { get; private set; }
public RestRoute(string resource)
{
this.Resource= resource;
MapRoute(resource, “index”, “GET”, null);
MapRoute(resource, “create”, “POST”, null);
MapRoute(resource + “/new”, “newitem”, “GET”, null);
MapRoute(resource + “/{id}”, “show”, “GET”, new { id = @”\d+” });
MapRoute(resource + “/{id}”, “update”, “PUT”, new { id = @”\d+” });
MapRoute(resource + “/{id}”, “delete”, “DELETE”, new { id = @”\d+” });
MapRoute(resource + “/{id}/edit”, “edit”, “GET”, new { id = @”\d+” });
}
public void MapRoute(string url, string actionName, string httpMethod,
object constraints)
{
RouteValueDictionaryconstraintsDictionary;if (constraints != null)
{
constraintsDictionary= new RouteValueDictionary(constraints);
}
else
{
constraintsDictionary= new RouteValueDictionary();
}
constraintsDictionary.Add(“httpMethod”, new HttpMethodConstraint(httpMethod));
_internalRoutes.Add(new Route(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new
{ controller = Resource, action = actionName}),
Constraints = constraintsDictionary
});
}
public override RouteDataGetRouteData(HttpContextBasehttpContext)
{
foreach(varroute in this._internalRoutes)
{
varrvd= route.GetRouteData(httpContext);
if (rvd!= null) return rvd;
}
return null;
}
public override VirtualPathDataGetVirtualPath(RequestContextrequestContext,
RouteValueDictionaryvalues)
{
foreach(varroute in this._internalRoutes)
{
VirtualPathDatavpd= route.GetVirtualPath(requestContext, values);
if (vpd!= null) return vpd;
}
return null;
}
Routes.Add(new RestRoute("Products"));
编辑Routes
Protected void Application_start(){
AreaRegistration.RegisterAllAreas();
RouteTable.Routes.registerRoutes(“~/Config/routes.cs”);
}
using System.Web.Mvc;
using System.Web.Routing;
using EditableRoutesWeb;
// Use this one for Full Trust
public class Routes : IRouteRegistrar
{public void RegisterRoutes(RouteCollectionroutes){
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(“Default”,“{controller}/{action}/{id}”,new {
controller = “Home”,
action = “Index”,
id = ““ });}}
使用Cache监控代码
using System;
using System.Web.Compilation;
using System.Web.Routing;
namespace EditableRoutesWeb{
public static class RouteRegistrationExtensions{
public static void RegisterRoutes(
this RouteCollectionroutes,stringvirtualPath){
ConfigFileChangeNotifier.Listen(
virtualPath, vp=> routes.ReloadRoutes(vp));
}
static void ReloadRoutes(this RouteCollectionroutes, string virtualPath)
{
varassembly = BuildManager.GetCompiledAssembly(virtualPath);
var registrar = assembly.CreateInstance(“Routes”) as IRouteRegistrar;
using(routes.GetWriteLock())
{
routes.Clear();
registrar.RegisterRoutes(routes);
}}}}
怎么知道有改变?
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
namespace EditableRoutesWeb{
public class ConfigFileChangeNotifier{
private ConfigFileChangeNotifier(Action<string> changeCallback)
: this(HostingEnvironment.VirtualPathProvider, changeCallback){}
private ConfigFileChangeNotifier(VirtualPathProvidervpp,
Action<string> changeCallback) {
_vpp= vpp;
_changeCallback= changeCallback;
}
VirtualPathProvider_vpp;
Action<string> _changeCallback;
// When the file at the given path changes, we’ll call the supplied action.
public static void Listen(string virtualPath, Action<string> action) {
varnotifier= new ConfigFileChangeNotifier(action);
notifier.ListenForChanges(virtualPath);
}
void ListenForChanges(string virtualPath) {
// Get a CacheDependencyfrom the BuildProvider, so that we know
// anytime something changes
varvirtualPathDependencies= new List<string>();
virtualPathDependencies.Add(virtualPath);
CacheDependencycacheDependency= _vpp.GetCacheDependency(
virtualPath, virtualPathDependencies, DateTime.UtcNow);
HttpRuntime.Cache.Insert(virtualPath/*key*/,
virtualPath/*value*/,
cacheDependency,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback(OnConfigFileChanged));
}
void OnConfigFileChanged(string key, object value,
ChItRdR) {...
2011-4-17 14:50 danny
发表评论
-
10.2Asp.net MVC各层使用TDD方式
2011-05-01 12:09 775Asp.net MVC各层使用TDD方式 Asp.net M ... -
10.1TDD简介
2011-04-30 23:09 536MVC中的测试驱动开发 为什么需要TDD TDD的由来 它 ... -
9、MVC程序安全限定
2011-04-29 22:14 1790常见网络安全攻击隐患 针对Asp.net MVC防御体系 安 ... -
8.2ASP.NET MVC2使用Ajax类库实例
2011-04-29 13:05 897ASP.NET MVC2使用Ajax类库实例 .net fo ... -
8.1Ajax类库介绍
2011-04-28 09:12 859在ASP.NET MVC中使用 -Microsoft ASP. ... -
7.2自定义开发Filter
2011-04-27 16:04 599Custom Filters ➤IAuthorization ... -
7.1Filter的使用
2011-04-26 22:20 483Filter的使用 -对Action的附加说明 Asp.n ... -
6.3Action的调用与属性
2011-04-26 09:43 649Action的调用与属性 1、唤起Action R ... -
6.2ActionResult的使用
2011-04-25 19:14 659ActionResult public abstract c ... -
6.1Controller类的基本构成
2011-04-25 09:17 645关于Controller Controller是什么? C ... -
5.6在Webform中使用routing
2011-04-23 22:48 640在Webform中使用routing 在Asp.net 4中使 ... -
5.4使用routing生成URL
2011-04-21 11:05 577使用routing生成URL URL生成器概述 1、质询每个 ... -
5.3使用Routes
2011-04-20 09:11 7245.3使用Routes 注册Area Route publi ... -
5.2Routes匹配URL的工作方式
2011-04-19 08:55 831URL的匹配规则 -site/{controller}/{ac ... -
5.1Url和Routes介绍
2011-04-17 12:05 6255.1Url和Routes介绍 关于Urls -域名好记好拼 ... -
4、View引擎介绍
2011-04-16 22:03 624View引擎介绍 Request =>Routing= ... -
3、HtmlHelper类(续)
2011-04-16 13:41 627HtmlHelper类(续) Html.TextArea 用 ... -
2、HtmlHelper类
2011-04-15 22:33 1073HtmlHelper类 <%Html. MVC1 & ... -
1、View层
2011-04-15 09:06 608ViewDataDictionary类 View 负责输出 ...
相关推荐
AM5.5服务端和客户AM5.5服务AM5.5服务端和客户端端和客户端端AM5.5服务端和客户AM5.5服务AM5.5服务端和客户端端和客户端端AM5.5服务端和客户AM5.5服务AM5.5服务端和客户端端和客户端端AM5.5服务端和客户AM5.5服务AM...
esxi 5.5 vsphere 5.5算号器
ce5.5 中文版 修改游戏内存的 ce5.5 中文版
mysql5.5版本和配置文件的详细说明。非常适合初学者。mysql5.5版本和配置文件的详细说明mysql5.5版本和配置文件的详细说明
VMware vSphere 5.5 监控和性能指南,全中文,共152页。 vSphere 5.5 vCenter Server 5.5 ESXi 5.5
mysql-5.5-win64位系统mysql5.5安装包和安装教程,下载下来解压出来安装包,按照教程安装即可。
CCS5.5详细安装过程,适用于早期5.5版本的CCS软件安装
正版北京精雕5.5.1048
vmware esxi 5.5 注册机 包括其他版本,很实用
集合网上资料和自身实际安装整理的centos5.5安装mysql5.5,文档中有5.5和5.6的下载地载,如果安装5.6还需要找一点资料。
内含安装和补丁及安装说明,补丁仅提供64位,如要32位,请自行搜索,安装方式相同,详见说明
JDPaint 5.5 转NC
PRODAVE 5.5rar,PRODAVE 5.5
Raize.v5.5Raize.v5.5Raize.v5.5Raize.v5.5Raize.v5.5Raize.v5.5
eclipse5.5 注册码 eclipse5.5 注册码 eclipse5.5 注册码 eclipse5.5 注册码
NetBot5.5本地验证NetBot5.5本地验证NetBot5.5本地验证NetBot5.5本地验证NetBot5.5本地验证
winrar5.5//
该文档以TMS320F28035为芯片的开发板,内容详实,从建立工程到调试烧写,有详细的操作步骤,适合初学者了解和熟悉CCS操作流程。加上这一篇文章(http://blog.csdn.net/u013359794/article/details/44832923),可以...
CE5.5英文版