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ルーティング:
対応アクション方法:
対応するビュー:
私たちはビューでHtmlを通ります.RouteLinkおよびHtml.AtionLinkは、2つのハイパーリンクをそれぞれ生成します.実行の結果は何ですか?
以上の結果から、Htmlを通過する奇妙な現象を見ることができます.RouteLink()で生成されたUrlは、私たちが設定したプロパティ、すなわちUrlアドレスのグローバル小文字を適用し、最後に斜線区切り記号があります.
しかしActionLinkは末尾に斜線を付けず、小文字も一切書かなかった.これはいったいどうしてですか.ご存知の方がいらっしゃいましたら、具体的な違いを教えてください.ありがとうございます.
したがって、すべての小文字を生成し、最後に斜線区切り記号を持つUrlアドレスを生成したい場合は、RouteLinkまたはRouteのgetVirtualpathData()を書き換えることで、すべての大文字を小文字化します.
注意:領域が追加されていない場合、Url.Action()で生成されたリンクは小文字ですが、領域を加えると失効します
今日私たちが思い出したのは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()で生成されたリンクは小文字ですが、領域を加えると失効します