ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

引言---

  在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量。

  URL重写与优化就是搜索引擎优化的手段之一。

  假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的,

  http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1。

  太多的QueryString对爬虫是不友好的,一般的做法是,去掉不必要的QueryString,让URL更简短 :http://www.xxx.com/category/1000。

  但一个好的URL要语义化,更好的反应网站结构,所以使用类名来作为URL要比分类id更胜一筹 :http://www.xxx.com/categoryname。

 

  这里列举了URL重写与优化的最为普遍的两个需求,

  这里将分为两篇来解决这两个问题。

  • 初级篇-使用Global路由表定制URL
  • 进阶篇-继承RouteBase玩转URL

 

  这里我假设各位看官已经对ASP.NET MVC 已经有所了解。文中有任何问题欢迎指正。

  

 

一,认识Global路由表

 

  我们新建一个ASP.NET MVC Web程序的时候,会生成一个Global.asax文件。如下:

 

View Code

  首先Application_Start()是Web应用程序启动的时候的入口。<RegisterGlobalFilters()方法是用来注册全局筛选器的,与本篇内容关系不大>

  而RegisterRoutes()方法是用来注册路由表的

  这里已经有了两条默认的路由规则:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  IgnoreRoute()是RouteCollection路由表类的扩展方法,用于忽略指定的路由请求。这句意思是忽略对扩展名为.axd文件的请求。<这个方法不在此详述>

 

   我们主要来看这一条路由规则:

 

 routes.MapRoute("Default", // 路由名称"{controller}/{action}/{id}", // 带有参数的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值);

 

  MapRoute()方法是一个添加路由映射的方法(RouteCollection类的扩展方法)。这里是它最常用的一个重载,映射指定的 URL 路由并设置默认路由值:

 

  • "Default"是路由的名称,这个名称在应用程序的路由的集合(routes对象)中是唯一的,如果重名生成时就会报错。
  • "{controller}/{action}/{id}"代表的是路由的 URL表达式
  •  new { controller = "Home", action = "Index", id = UrlParameter.Optional } 声明了一个包含路由值的object匿名对象

   

  这条语句添加了一条路由规则,将URL表达式映射到一个路由值-指向某个Controller下的某个Action方法。

  e.g.:我们在浏览器中输入相对地址/home/index HomeController.Index()方法就会被调用。

 

  发布网站的时候Global.asax文件会被编译成DLL。程序启动的时候就会首先调用Application_Start()方法, 

  执行RegisterRoutes(RouteTable.Routes)语句后,路由表就完成注册了,默认路由规则开始生效。

  有了这条默认规则,我们就可以使用/controllername/actionname?querystring=...这样的相对URL来调用程序中的每个action方法。

  熟悉ASP.NET MVC的人可以想到,如果没有什么特殊要求的系统,比如网站后台,就不用再折腾了,一条默认路由规则足矣撑起整个Web程序了。

 

 

二,路由匹配规则

 

  1.首先我们需要科普一下如何来定义一条URL表达式。

  首先URL表达式都是相对的,不包括主机域名部份(比如http://www.xxx.com)。{}保存的是占位符,“/”,“.”则用来作为分隔符,什么都有没则是静态内容:

  • URL /category/showcategory/1000  匹配 "{controller}/{action}/{id}"。
  • URL /product/2012/4/28.html         匹配  “/product/{year}/{month}/{day}.html”  ,诸如此类。

 

  这里需要注意的是{controller}和{action}是保留的两个占位符,分别代表对应的控制器名称和操作名称。

  {controller}对应控制器的名称,这里规定是控制器全名去掉Controller后缀的部份,CategoryController即Category

  {action}对应控制器内的Action方法的名称。

 

  2.路由有两种不同的操作。

 

  获取路由值,当你在浏览器输入一个URL时,程序会在我们添加的路由表中通过对比URL表达式进行匹配,找到对应路由值。

    我们来看一个例子,我们来添加两条路由规则。

routes.MapRoute("Test", "where-are-you-going", new { controller = "Home", action = "Index" });
routes.MapRoute("Test1", "where-are-you-going", new { controller = "Home", action = "Others" });

  假设HomeController里有两个Action 分别是Index()和Others()。

 

  各位看官觉得在浏览器输入http://www.xxx.com/where-are-you-going 哪个方法会被调用呢?如果上下颠倒一下呢?

  <调用HomeController.Index()/颠倒后调用HomeController.Others>

 

  获取URL,下面这段代码就使用Url.Action方法通过Controller和Action名完全限定了一个URL,

  即我们有了一个路由值,通过在路由表中匹配,可以找到对应的URL模式,进而生成一个URL

<a href="@Url.Action("Index", "Home")">主页</a>

  现在我们在默认的路由规则下再添加一条如下的路由规则

routes.MapRoute("MyHome", "myhome/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

  你觉得页面会显示什么呢?

<a href="http://www.xxx.com/">主页</a>
or
<a href="http://www.xxx.com/myhome">主页</a>

 

   如果把这条路由规则写在默认规则的上面呢?

   <谁写在上面就显示其匹配的URL>

 

 

  3.上面的问题大家可以自己尝试一下,很明显,路由的匹配是 自上而下 的,只要匹配到第一条记录,就会返回对应URL或者路由值。

  这一点非常重要。很多人在定制路由规则的时候,总是发现自己的规则不生效。那么你就应该检查是不是被前面的路由覆盖掉了。

 

三,解决开始的问题

 

  从这个站的URL可以看出,

  http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1,

  用的应该只是默认路由规则,

  可以推断出有一个名为Category的控制器,其中有个方法名为ShowCategory,必选参数为categoryid,其他为可选参数。

  根据上面介绍的Global路由表来完成URL重写的知识,

  按照站长的要求,我们只需要添加一条路由规则就完事了。是不是很简单?

 

routes.MapRoute("Category", "category/{categoryid}", new { controller = "Category", action = "ShowCategory" }

  

  这时候一定要注意喔,不要写在默认路由的下面,你懂得。不然你就悲剧了。

 

  一般情况下我们建议如果你需要使用Globel文件来定制路由,请删除最初的默认路由,并给每一个Action定制自己的路由。

routes.MapRoute("Home", "", new { controller = "Home", action = "Index" });

  使用上述路由来取代默认路由。

  浏览器输入相对URL “/”时就会调用HomeController.Index()方法了。

  这样做的原因是,默认路由容易与定制路由起冲突。

 

  强烈建议大家自己动手玩一玩Global文件,重写URL来亲身感受一下。其实有一个悬念我留给大家了,

  为什么默认规则下获取首页的URL是“/”而不是“/home/index”呢。^_^

  匹配规则还有贪婪匹配和缺省匹配一说,这个留大家去了解把。

 

 

  使用Global还是有很多的局限性的,上例中因为方法ShowCategory有一个参数categoryid,它存在与路由信息的键值对中,

  在配置时我们就可以使用占位符来{categoryid}来显示它。

  换作http://www.xxx.com/categoryname 这样的URL,如果不修改程序,Global是无能为力的,因为categoryname并不存在与路由信息的键值对中。

  应对这样的较为复杂多变的URL重写与优化的需求(需求总是复杂多变的=。=)。

 

  ---------------------------------------初级篇完--------------------------------------------

转载于:https://www.cnblogs.com/littlewrong/p/5540035.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MS SQLSERVER 各种乱七八糟

2019独角兽企业重金招聘Python工程师标准>>> 这个是看完了sql语法的一点个人练手&#xff0c;没什么价值&#xff0c;权且当做记录 select employee_id,dept_code,last_name,manager_id from l_employees where last_name like %e%--%代表任意字符串 order by dept_…

[C++11 std::thread] 使用C++11 编写 Linux 多线程程序

From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html 本文讲述了如何使用 C11 编写 Linux 下的多线程程序&#xff0c;如何使用锁&#xff0c;以及相关的注意事项&#xff0c;还简述了 C11 引入的一些高级概念如 promise/future 等。 前言 在这个…

div 背景图 居中

这里主要是 background-position: center;属性很给力 div{width: 100%;height: 100%;background-image: url(../../../assets/initialize.png);background-repeat: no-repeat;background-size:70px 70px;background-position: center;}

CCNA知识总结(一)

什么是路由&#xff1a; 路由就是为了形成“FIB”。 在路由器上分为2大类&#xff1a; 1&#xff09; Coutrol Plane 控制平面就是&#xff1a;“路由协议”&#xff0c;就是为了2个设备之间的交互来形成“FIB”。 2&#xff09; Data Plane 数据平面就是&#xff1a;“Forw…

记录uni-app弹框事件无生命周期问题;uni-popup-dialog打开触发事件;uni-popup-dialog调用接口时机

项目需求&#xff1a;点击页面的 品牌型号 按钮&#xff0c;打开弹框&#xff0c;将 车架号码 参数传入接口获取到对应的 品牌型号列表&#xff0c;在进行选择后关闭弹框。 实际开发中&#xff0c;我在父组件里面引入了弹框子组件&#xff1b;诡异的事情发生了&#xff1a; 在…

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

From: http://www.cnblogs.com/lanxuezaipiao/p/3703988.html 导读 1. 什么是序列化&#xff1f; 2. 为什么要序列化&#xff1f;好处在哪里&#xff1f; 3. C对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化&#xff1f; 程序员在编写应用程序…

SCCM 2012系列16 操作系统播发⑤

添加了操作系统映像&#xff0c;也创建了任务序列&#xff0c;那么我们改对创建的任务序列编辑一下了&#xff0c;以满足我们播发下去系统的要求是我们想要的&#xff0c;比如分区是怎么样的&#xff0c;当然分区不是固化的&#xff0c;是按照百分比来进行划分的&#xff0c;详…

vue旋转图片功能,旋转放大图片功能;vue旋转放大div元素

需求&#xff1a;可以旋转、放大、颠倒图片。 html: <div class"imgtop"><img class"imgboxele" id"xingshizhengzhengben" :src"imgurl" alt""></div><div class"imgtxt">行驶证正本<…

xp和win7安装telnet服务

xp&#xff1a; 有些ghost版本的xp会精简掉telnet服务 首先telnet服务需要的几个文件&#xff1a; tlntadmn.exe tlntsess.exe tlntsvr.exe tlntsvrp.dll 文件分享&#xff1a;https://yunpan.cn/cSaaaXjUrKFHu 访问密码 719d 将以上几个文件拷贝到c:\windows\system32下&…

linux centos7.2 nodeJs全局安装

先下载nodeJS 选一个linux版本的http://nodejs.cn/download/ 下载下来得到个node-v8.12.0-linux-x64.tar.xz这样的文件 用xftp上传到服务器你想安装的目录 xftp破解版链接:http://www.xue51.com/soft/1456.html xshell破解版链接:http://www.cncrk.com/downinfo/219821.html …

WebView 和JS 之间交互

2019独角兽企业重金招聘Python工程师标准>>> 1.android中利用webview调用网页上的js代码。 Android 中可以通过webview来实现和js的交互&#xff0c;在程序中调用js代码&#xff0c;只需要将webview控件的支持js的属性设置为true&#xff0c;&#xff0c;然后通过lo…

【libjpeg.lib】在Windows7下编译生成libjpeg.lib

一、准备&#xff1a; 下载最新的jpeg库源码&#xff1a;http://www.ijg.org/files/jpegsr9a.zip 二、编译 1. 解压到指定目录&#xff0c;我是&#xff1a;E:\program\opensource\jpeg-9a-win 2. 打开VS2010命令行窗口(为了得到VS2010的环境)&#xff0c;并切换到E:\program…

uni-app图片加水印;小程序图片添加水印;使用canvas上传图片加水印

原博主&#xff1a;点击查看 需求&#xff1a; 微信小程序&#xff0c;上传图片&#xff0c;成功后图片有水印&#xff0c;既图片的网络地址也有水印。 上传图片使用uni-app的uni.chooseImage&#xff08;&#xff09;方法&#xff0c;水印是用canvas。 以下代码可以直接使用…

vue或js解析文件excel表格js通过插件解析表格读取文件

安装插件 cnpm i xlsx --save-dev cnpm i jquery --save-dev 引入插件 html引入文件 <input type"file" id"excel-file" value"file"/> dom加载完成解析文件 mounted() {$(#excel-file).change(function(e) {var files e.target.fi…

微信小程序request请求封装;微信小程序封装request请求;uni-app小程序封装request请求;

本片封装了微信小程序request请求&#xff1b;为别是post get put请求&#xff0c;重点在request.js文件 1.新增四个文件 2.根目录下的utils下的request.js封装uni.request()请求 2.1 manifest.json&#xff1a;解决H5浏览器跨域问题-----配置代理一定要重启项目 // 自定义配…

关“视觉神经系统是怎么形成的?”的思考

http://www.cnblogs.com/mrxsc/p/5571358.html 视觉信息的处理是一个非常复杂的过程&#xff0c;这不由得让我想到了同样位于人们大脑中的新大脑皮层&#xff0c;作为人类智能的起始之地&#xff0c;它的运作也不简单&#xff0c;但是在婴儿时期&#xff0c;它的各部分单元并没…

uni-app控制小程序版本更新;小程序自动更新版本;uni-app发布新版本后仍旧是老版本问题

问题&#xff1a; 首先小程序&#xff0c;更新版本发布后&#xff0c;用户的版本一般情况下仍是旧版本&#xff1b;需要手动删除小程序后&#xff0c;在重新搜索打开才能使用新版本&#xff1b; 原因查看&#xff1a; 运营机制&#xff1b;更新机制&#xff1b; 解决办法&…

浅尝boost之format

From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东&#xff0c;但实际使用时基本在每个程序里都会遇到不愉快的事情&#xff1a;格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC&#xff0c;ATL等本…

nuxt 服务器构建因太耗CPU进程被杀解决办法

在本地打包然后上传到github 再下载到服务器 如果你项目中有.gitignore那把里面的.nuxt删了(.gitignore是设置GIT不上传的文件)并把dist改为/dist 然后用git或者sourcetree上传项目到github&#xff0c;我这里用的sourceTree 上传完成 到服务器把项目下载下来 我这用的linu…

实用的rpm网站

http://www.rpmfind.net和 http://rpm.pbone.net/转载于:https://blog.51cto.com/nickcoco/993222