首页 > 代码库 > MVC中的AppendTrailingSlash以及LowercaseUrls
MVC中的AppendTrailingSlash以及LowercaseUrls
asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行扩展,所以要学好还是需要了解框架的运行原理,推荐Artech.
今天我们回忆的不是MVC中的filter,也不是Controller的激活或者是Action的执行,或者是Url路由RouteData的生成,我们来回忆的是RouteTable.Routes ,即全局路由表的两个属性。AppendTrailingSlash以及LowercaseUrls。
AppendTrailingSlash的作用就是是否在 生成 的Url末尾添加/ 斜线(如果没有存在的话)。设置为true,则会在生成的Url末尾添加斜线,否则不会 自动添加。
LowercaseUrls的作用就是是否将生成的Url 转换成小写形式。因为对于搜索引擎来说,可能Url地址的大小写会不同对待。
这两个属性作用的是生成的Url,即会通过RouteTable.Routes.GetVirtualPath()通过传入的请求上下文RequestContext来获取Url。
可能你会说,如果我想实现生成的Url小写,那么我就将LowercaseUrls设置为true,就可以,事实真的是这样的吗?我们来做个试验。
注册的Url路由:
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 6 routes.AppendTrailingSlash = true;//是否添加斜线 分隔符 7 routes.LowercaseUrls = true;//Url是否小写 8 routes.MapRoute( 9 name: "Default",10 url: "{controller}/{action}/{id}",11 defaults: new { controller = "Home", action = "index", id = UrlParameter.Optional },12 namespaces: new string[] { "MvcApplication3.Controllers" }13 );18 }19 }
对应的Action方法:
1 [ActionName("List")]2 public ActionResult List()3 {4 ViewBag.employees = repository.EmployeeRepository.GetEmployees("");///是获取一个几个列表5 return View();6 }
对应的View:
1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width" />10 <title>List</title>11 </head>12 <body>13 <div>14 @{15 List<MvcApplication3.Models.Employee> listEmployee = ViewBag.Employees as List<MvcApplication3.Models.Employee>;16 }17 @{18 if (listEmployee != null)19 {20 <ul>21 @{22 23 foreach (var item in listEmployee)24 {25 <li>26 @Html.RouteLink("RouteLink"+item.Name, "Default", new { action = "Detail", controller = "Home", id = item.Id })27 <br />28 @Html.ActionLink("ActionLink"+item.Name, "DETAIL", "home", new { id = item.Id }, new { target = "_blank" }) 29 </li>30 }31 }32 </ul>33 }34 else35 {36 37 <div>列表中无数据显示</div>38 }39 }40 </div>41 </body>42 </html>
我们在视图中通过Html.RouteLink以及Html.AtionLink来分别生成两个超链接。执行的结果是什么呢?
1 <li>2 <a href=http://www.mamicode.com/"/home/detail/0/">RouteLinkguozhiqi0</a> <!--这是通过RouteLink生成的Url-->3 <br />4 <a href=http://www.mamicode.com/"/home/DETAIL/0" target="_blank">ActionLinkguozhiqi0</a> <!--这是通过ActionLink生成的Url--> 5 </li>
通过上面的结果我们可以看到一个奇怪的现象,就是通过Html.RouteLink()生成的Url应用了我们设置的属性,即Url地址全局小写,并且末尾有一个斜线分隔符。
但是ActionLink却没有在末尾添加斜线,也没有全部小写。这究竟是为什么呢?如果有人知道,麻烦告知一下具体区别。谢谢。
所以如果我们想生成全部小写并且末尾有斜线分隔符的Url地址,就采用RouteLink或者重写Route的getVirtualpathData()来将所有大写字母小写化。
注意:当没有添加区域的时候,Url.Action()生成的链接是小写的,但加上区域后失效
MVC中的AppendTrailingSlash以及LowercaseUrls