MVCのAppendTrailingSlashおよびLowercaseUrls

11248 ワード

asp.NetMVCは非常に拡張性のあるフレームワークであり、Urlリクエストから最終的なhtmlのレンダリングまで拡張可能であるため、フレームワークの動作原理を理解するか、Artechを推奨する必要がある.
今日私たちが思い出したのはMVCのfilterではなく、Controllerのアクティブ化やActionの実行、あるいはUrlルーティングRouteDataの生成ではなく、RouteTable Tableを思い出します.Routesは、グローバル・ルーティング・テーブルの2つのプロパティです.AppendTrailingSlashおよびLowercaseUrls.
AppendTrailingSlashの役割は、生成されたUrlの末尾に/斜線を追加するかどうかです(存在しない場合).trueに設定すると、生成されたUrlの最後に斜線が追加されます.そうしないと、自動的に追加されません.
LowercaseUrlsの役割は、生成されたUrlを小文字に変換するかどうかです.検索エンジンにとっては、Urlアドレスの大文字と小文字が異なる場合があるからです.
この2つの属性は、生成された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     }

対応アクション方法:
1   [ActionName("List")]

2         public ActionResult List()

3         {

4             ViewBag.employees = repository.EmployeeRepository.GetEmployees("");///         

5             return View();

6         }

対応するビュー:
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は、2つのハイパーリンクをそれぞれ生成します.実行の結果は何ですか?
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()を書き換えることで、すべての大文字を小文字化します.
 
注意:領域が追加されていない場合、Url.Action()で生成されたリンクは小文字ですが、領域を加えると失効します