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:确保一个地址对应一个内容是非常重要的,

时间: 2024-11-08 20:22:49

mvc Routing特性优化的相关文章

Asp.net MVC]Asp.net MVC5系列——Routing特性

目录 概述 路由特性 使用路由 可选参数和参数的默认值 路由前缀 默认路由 路由约束 自定义路由约束 路由名 区域(Area) 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列--第一个项目 [Asp.net MVC]Asp.net MVC5系列--添加视图 [Asp.net MVC]Asp.net MVC5系列--添加模型 [Asp.net MVC]Asp.net MVC5系列--从控制器访问模型中的数据 [Asp.net MVC]Asp.net MVC5系列--添加数据

MVC常用特性

MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常有用的MVC特性,如下: BindAttribute Remote HandleError HiddenInput BindAttribute 使用BindAttribute的目的是限制用户在提交form表单时使用合适且正确的值.当我们提交一个表单时,就会检查每一个实体上绑定的特

MVC - Routing - 网址路由

1. Routing  : 路由 主要是比对通过浏览器传来的http要求与响应适当的网址给浏览器. ? 1 @Html.ActionLink("关于","About","Home") 这段代码生成的HTML超连接: ? 1 <a href="/Home/About">关于</a> 2. 默认情况下 网址路由规则定义在 App_Start\RouteConfig.cs文档中. ? 1 2 3 4 5 6

ASP.NET MVC 3 网站优化总结(六)压缩 HTML

压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完成 html 的压缩. 其实我们在 ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩这篇文章中使用的就是这种方法,主要看看实现的 FilterAttribute 类: public class WhitespaceFilterAttribute : ActionFilterAtt

ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header

继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The following publicly cacheable, compressible resources should have a "Vary: Accept-Encoding" header. 相信很多人遇到过这个问题,它是什么意思呢?网上找到的资料为: 原来对CSS和JS文件开启Gz

ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 IE6 时不会发送 Accept-Encoding 请求头,这样就不支持 Gzip 压缩功能了,所以这里号召大家使用 Google Chrome.在 ASP.NET MVC 3 中我们通过实现 ActionFilter 来实现,如下: public class CompressAttribute :

ASP.NET MVC最新特性

问题: 既然我说对ASP.NET MVC很熟很懂,对新技术很感兴趣,那么问题是: 当前最新版MVC是什么?你用的哪个版本?相比前一个版本有什么新的特性? --- 答案:TBD 解析: 在面试的时候,为了争取面试官的好感,显示自己的自信,在显露自己在某个方面的能力的时候要小心,很可能为自己挖一个大坑,当然除非是你对这个真的很熟很懂,说到底还是要提高自己的能力和研究技术或问题的深度,否则不要轻易的去吹嘘,否则被戳破了会很难堪,下不了台,反而给面试官留下华而不实的印象:要记住面试官先天的会对你说的话,

框架开发之——AngularJS+MVC+Routing开发步骤总结——5.14

1.延续MVC的观念:包括路由映射的编写,Controller的内容,具体View页面js的分离. 2.结合AngularJS做前端,后端使用Node.Js的写法,引入MVC框架,进行快速的开发. 步骤总结如下: 1.view页面修改,文件夹名称,文件名称,名称的大小写规范,在base文件夹中的main.ejs文件中记得注册. 注意使用angular.js进行前端页面的编写,以及相应页面代码的编写,相关angular.Js用法的收集. 2.view对应js文件的编写,文件夹的名称,文件名称,名称

利用Routing特性提高ASP.NET MVC3站点的SEO权重

简介 我们在开发互联网程序的时候,有个很重要的事情就是做搜索引擎优化(SEO),我们都知道ASP.NET MVC程序提供了友好的URL以及永久重定向的支持,这些友好的URL是利用Routing系统的特性来支持的,但是在这个Routing里有个问题,就是多个不同的地址和指向同一个action方法,那对于搜索引擎来说就意味着你的站点有很多地址的内容都是重复的. 本章内容将展示如果解决这一问题. 正文 对于SEO,一个地址对应一个唯一独立的内容是保证最好权重的一个重要步骤,所以我们需要确保每一个URL