談談asp.net 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             else
35             {
36 
37                 <div>列表中無數據顯示</div>
38             }
39         }
40     </div>
41 </body>
42 </html>

我們在視圖中通過Html.RouteLink以及Html.AtionLink來分別生成兩個超鏈接。執行的結果是什么呢?

1  <li>
2                         <a href="/home/detail/0/">RouteLinkguozhiqi0</a>  <!--這是通過RouteLink生成的Url-->
3                         <br />
4                         <a href="/home/DETAIL/0" target="_blank">ActionLinkguozhiqi0</a> <!--這是通過ActionLink生成的Url-->                                               
5                     </li>

通過上面的結果我們可以看到一個奇怪的現象,就是通過Html.RouteLink()生成的Url應用了我們設置的屬性,即Url地址全局小寫,並且末尾有一個斜線分隔符。

但是ActionLink卻沒有在末尾添加斜線,也沒有全部小寫。這究竟是為什么呢?如果有人知道,麻煩告知一下具體區別。謝謝。

所以如果我們想生成全部小寫並且末尾有斜線分隔符的Url地址,就采用RouteLink或者重寫Route的getVirtualpathData()來將所有大寫字母小寫化。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM