mvc Routing特性优化
在mvc中,Url地址是利用routing特性来支持,但是这个Routing有个问题,多个不同的地址和指向同一个action方法,
例如:
http://test.com (默认)
http://test.com/ (斜杠结尾)
http://test.com/Home (带有Controller)
http://test.com/Home/Action (带有Controller和Action)
http://test.com/home/Action (不同的情况)
解决方法:通过使用注册全局的filter
先定义一个filter
public class RemoveDuplicateContentAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var routes = RouteTable.Routes;
var requestContext = filterContext.RequestContext;
var routeData = requestContext.RouteData;
var dataTokens = routeData.DataTokens;
if (dataTokens["area"] == null)
dataTokens.Add("area", "");
var vpd = routes.GetVirtualPathForArea(requestContext, routeData.Values);
if (vpd != null)
{
var virtualPath = vpd.VirtualPath.ToLower();
var request = requestContext.HttpContext.Request;
if (virtualPath != request.Path)
{
filterContext.Result = new RedirectResult(virtualPath + request.Url.Query, true);
}
}
base.OnActionExecuting(filterContext);
}
}
然后注册这个filter:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//整个程序所有控制器都使用HandlerError来处理错误
//不过它只处理500系列错误,404类型需要单独处理
filters.Add(new HandleErrorAttribute());
filters.Add(new RemoveDuplicateContentAttribute());
}
总结:
首先获取当前的RequestContext和RouteData,然后判断如果当前没有使用Area的话就为DataToken添加一个空值,这个非常重要,否则,后面再使用Area特性的话就会出错
接着该filter通过RouteData获取虚拟path,然后toLower转成小写
然后和当前request的path进行比较,如果不一致就重定向到小写的虚拟path上,这样搜索引擎就能识别当多个请求其实都是对应虚拟的path的真实地址上,也就是唯一的action地址,
对于SEO:确保一个地址对应一个内容是非常重要的,
mvc Routing特性优化的更多相关文章
- Asp.net MVC]Asp.net MVC5系列——Routing特性
		
目录 概述 路由特性 使用路由 可选参数和参数的默认值 路由前缀 默认路由 路由约束 自定义路由约束 路由名 区域(Area) 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列— ...
 - ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header
		
继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The ...
 - ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩
		
网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 ...
 - ASP.NET MVC 3 网站优化总结(六)压缩 HTML
		
压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完 ...
 - MVC常用特性
		
MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...
 - ASP.NET MVC最新特性
		
问题: 既然我说对ASP.NET MVC很熟很懂,对新技术很感兴趣,那么问题是: 当前最新版MVC是什么?你用的哪个版本?相比前一个版本有什么新的特性? 解析: 在面试的时候,为了争取面试官的好感,显 ...
 - ASP.NET MVC Routing学习笔记(一)
		
Routing在ASP.NET MVC中是非常核心的技术,属于ASP.NET MVC几大核心技术之一,在使用Routing之前,得先引入System.Web.Routing,但其实不用这么麻烦,因为在 ...
 - ASP.NET(支持 ASP.NET MVC)性能优化包 - combres 介绍
		
项目地址:https://github.com/buunguyen/combres Overview Combres (previously hosted in CodePlex) helps you ...
 - 关于MVC的特性(AuthorizeAttribute)的一些理解
		
许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限. 在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段. 要限制对 ASP.NET MVC 视图的访问 ...
 
随机推荐
- WPF学习小记
			
WPF通用控制事件 Click:当控件被单击时发生.某些情况下,当用户按下Enter键时也会发生这样的事件. Drop:当拖曳操作完成时发生,也就是说,当用户将某个对象拖曳dao该控件上,然后松开鼠标 ...
 - HOOK windows消息 C# 代码
			
Option Explicitprivate [DllImport("GAIS", SetLastError=true)] static extern long CallWindo ...
 - mac os develop
			
. 安装PCRE Download latest PCRE. After download go to download directory from terminal. $ cd ~/Downloa ...
 - java中的hashtable
			
好久没写博客了,这次总结一下hashtable,哈希表是我们在数据结构时候所学,在网络安全时候,老师说可以用来加密,在数据库中,可以用来当作索引. http://www.cnblogs.com/leo ...
 - json里的日期字符串 怎么 转换成 javascript 的 Date 对象?
			
“/Date(1232035200000)/” 怎么转换成 javascript 的 Date 对象 做法:new Date(+/\d+/.exec(value)[1]); value就是json字 ...
 - HDU5366 The mook jong (DP)
			
The mook jong 问题描述 ZJiaQ为了强身健体,决定通过木人桩练习武术.ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里.由于ZJiaQ是个强迫症,所以他要把一个木 ...
 - A Tour of Go  For continued
			
As in C or Java, you can leave the pre and post statements empty. package main import "fmt" ...
 - 拼接<a>标签相关属性
			
<s:iterator value="#session.funcs" id="sonbean"> <s:if test="%{#so ...
 - scrollTop 值为 0
			
由scrollTop兼容问题引起: 在 Firefox 和 IE 中,使用 document.documentElement.scrollTop 获取: 在 Chrome 中,使用 document. ...
 - Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片
			
使用xcode6来运行项目,发现使用原生的tabbar上的图片不显示了. 这个问题是因为xcode6中的一些api方法被废弃了,同时tabbar上图片的渲染方式发生了改变. 先看xcode6中的tab ...