mvc-自定义Route
public class CustomerRoute : RouteBase
{
//从路径中解析出controller、action以及其他参数,创建RouteData(其中包括HttpHandler),然后调用HttpHandler处理请求
public override RouteData GetRouteData(System.Web.HttpContextBase httpContext)
{
var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath + httpContext.Request.PathInfo;//获取相对路径 virtualPath = virtualPath.Substring().Trim('/');//此时URL会是~/ca-categoryname,截取后面的ca-categoryname if (!virtualPath.StartsWith("ca-"))//判断是否是我们需要处理的URL,不是则返回null,匹配将会继续进行。
return null; var categoryname = virtualPath.Split('-').Last();//截取ca-前缀后的分类名称 //尝试根据分类名称获取相应分类,忽略大小写
var category = CategoryManager.AllCategories.Find(c => c.CategoeyName.Equals(categoryname, StringComparison.OrdinalIgnoreCase)); if (category == null)//如果分类是null,可能不是我们要处理的URL,返回null,让匹配继续进行
return null; //至此可以肯定是我们要处理的URL了
var data = new RouteData(this, new MvcRouteHandler());//声明一个RouteData,添加相应的路由值
data.Values.Add("controller", "CustomerRoute");
data.Values.Add("action", "ShowCategory");
data.Values.Add("id", category.CategoeyID); return data;//返回这个路由值将调用CategoryController.ShowCategory(category.CategoeyID)方法。匹配终止
}
//根据RouteValueDictionary转换成url
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
//判断请求是否来源于CategoryController.Showcategory(string id),不是则返回null,让匹配继续
var categoryId = values["id"] as string; if (categoryId == null)//路由信息中缺少参数id,不是我们要处理的请求,返回null
return null; //请求不是CategoryController发起的,不是我们要处理的请求,返回null
if (!values.ContainsKey("controller") || !values["controller"].ToString().Equals("CustomerRoute", StringComparison.OrdinalIgnoreCase))
return null;
//请求不是CategoryController.Showcategory(string id)发起的,不是我们要处理的请求,返回null
if (!values.ContainsKey("action") || !values["action"].ToString().Equals("showcategory", StringComparison.OrdinalIgnoreCase))
return null; //至此,我们可以确定请求是CategoryController.Showcategory(string id)发起的,生成相应的URL并返回
var category = CategoryManager.AllCategories.Find(c => c.CategoeyID == categoryId); if (category == null)
throw new ArgumentNullException("category");//找不到分类抛出异常 var path = "ca-" + category.CategoeyName.Trim();//生成URL return new VirtualPathData(this, path.ToLowerInvariant());
}
}
mvc-自定义Route的更多相关文章
- ASP.NET MVC:自定义 Route 生成小写 Url(转)
先给出本文中测试用的 controller: public class PersonsController : Controller { public ActionResult Query(strin ...
- MVC自定义路由02-实现IRouteConstraint限制控制器名
通过实现IRouteConstraint接口,实现对某个控制名进行限制.本篇把重点放在自定义约束,其余部分参考: MVC自定义路由01-为什么需要自定义路由 自定义约束前 using Syste ...
- asp.net mvc 自定义pager封装与优化
asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...
- mvc自定义全局异常处理
异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...
- ASP.NET MVC 自定义路由中几个需要注意的小细节
本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...
- MVC 自定义过滤器/特性来实现登录授权及验证
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 最近在做自学MVC,遇到的问题很多,索性一点点总结 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...
- MVC自定义AuthorizeAttribute实现权限管理
[转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权 ...
- MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器
实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过A ...
随机推荐
- 进程peb结构、获得peb的方法
PEB :进程环境块TEB.ProcessEnvironmentBlock成员就是PEB的结构体地址TEB结构体位于FS段选择符所指的段内存的起始地址处,且ProcessEnvironmentBloc ...
- linux 命令——38 cal (转)
cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal ...
- ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
题目链接: https://vjudge.net/problem/ZOJ-1654 题目大意: 有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地.草地.墙.机器人只能放在空 ...
- 【BZOJ1833】[ZJOI2010] count 数字计数(数位DP)
点此看题面 大致题意: 求在给定的两个正整数\(a\)和\(b\)中的所有整数中,\(0\sim9\)各出现了多少次. 数位\(DP\) 很显然,这是一道数位\(DP\)题. 我们可以用前缀和的思想, ...
- 【BZOJ1854】[SCOI2010] 游戏(匈牙利算法的应用)
点此看题面 大致题意: 有\(n\)个物品,每个物品有两个属性且只能选择其中的一个,要求选择的物品属性值从\(1\)开始递增,问最多能选多少个. 暴搜 看到这题,我第一反应是暴搜... ... 好不容 ...
- 10个HTML5 实战教程 提升你的综合开发能力
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- c++中 endl的意思?
endl是 end line的意思,表示此行结束,换行,就是回车
- Drop it-freecodecamp算法题目
Drop it 1.要求 丢弃数组(arr)的元素,从左边开始,直到回调函数return true就停止. 第二个参数,func,是一个函数.用来测试数组的第一个元素,如果返回fasle,就从数组中抛 ...
- 判断IP连接数前五,并自动加入防火墙
#!/bin/bash #Author Template #Time -- : log_file=/tmp/tmp.log JudgeExt(){ if expr "$1" : & ...
- VPS搭建***
yum -y install epel-release** yum update yum -y install python-setuptools m2crypto supervisor easy_i ...