繼ASP.NET MVC學習之路由篇(2)后繼續學習。
11.根據路由輸出鏈接
既然是網站開發自然少不了鏈接,我們已經學會了強大的路由,但是還缺少一步就是能夠將這些路由的路徑輸出到頁面,下面我們就開始學習如何輸出路由路徑。
首先我們的路由注冊部分如下所示:
1 namespace MvcStudy 2 { 3 public class RouteConfig 4 { 5 public static void RegisterRoutes(RouteCollection routes) 6 { 7 routes.Add(new Route("MyTest",new DonwloadHandler())); 8 9 routes.MapRoute( 10 name: "Default2", 11 url: "{controller}/{action}/{id}", 12 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 13 ); 14 } 15 } 16 }
下面我們開始在Views\Home\Index.cshtml中輸出路徑(如果沒有對應的控制器或頁面請自行新建):
1 @Html.ActionLink("Index", "Index") 2 @Html.ActionLink("List","List")
該方法的第一個是鏈接的名稱,第二個是方法的名稱。
最終在生成的頁面中將是如下的代碼:
1 <a href="/">Index</a> 2 <a href="/Home/List">List</a>
因為當前的頁面就是Views/Home/Index所以第一個直接輸出的就是"/",其次就是第二個路徑,默認是當前的控制器所以最后組成的路徑是"/Home/List"。
當然我們也可以手動指定某個控制器,比如下面的代碼:
1 @Html.ActionLink("Index", "Index","User") 2 @Html.ActionLink("List","List","User")
這里我們使用了第三個參數,就是用來指定控制器的。
注:ActionLink方法傳入的方法名和控制器名,並不會受當前是否存在這個控制器或這個方法。一樣會按照路由的路徑輸出。
查看上面的路由中我們還可以發現還有一個id這個可選參數,當然你們一定會想知道如何使用ActionLink將這個參數傳入,下面我們將代碼改寫成如下:
1 @Html.ActionLink("Index", "Index", "User", new { id = "123" }, null) 2 @Html.ActionLink("List", "List", new { id = "123" })
這里博主有一個很奇怪的地方就是ASP.NET MVC3中的第一個的寫法可以是@Html.ActionLink("Index", "Index", "User", new { id = "123" })
但是我演示的時候用的是MVC4,卻要在后面加個null參數,否則最終輸出的路徑后面會有這樣一個查詢字符串(?Length=4),應該是將"User"這個
當作了路由參數。
繼續查看最終生成的代碼:
1 <a href="/User/Index/123">Index</a> 2 <a href="/Home/List/123">List</a>
當然我們也不一定非要傳遞路由中有的參數,一樣可以傳遞其他的參數,比如如下結果:
1 @Html.ActionLink("Index", "Index", "User", new { id = "123" , fid = "123", sid = "123"},null) 2 @Html.ActionLink("List", "List", new { id = "123" ,tid = "asd",asf= "1"})
最終的結果如下所示:
1 <a href="/User/Index/123?fid=123&sid=123">Index</a> 2 <a href="/Home/List/123?tid=asd&asf=1">List</a>
這里我們可以發現&被編碼了,這里的&就是&。同時也可以看到路由中不存在的參數采用了查詢字符串的方式進行了傳遞。大家可能以為
到這里就結束了,因為你已經可以定位到某個控制器的某個方法。我相信有些有遠見的人一定還知道ASP.NET MVC中還存在區域這個技術,那
么問題就出來了,我們如何定位到區域中的某個控制器的某個方法呢?
這里我們新建一個admin的區域,並且重新編譯(如果不重新編譯那么最后得出的路徑中就會把區域作為查詢字符串),然后將代碼改寫成如下:
1 @Html.ActionLink("Index", "Index", new { area = "admin", controller = "Admin" }) 2 @Html.ActionLink("List", "List", new { id = "123" ,tid = "asd",asf= "1"})
刷新頁面,查看頁面源代碼得出:
1 <a href="/admin/Admin">Index</a> 2 <a href="/Home/List/123?tid=asd&asf=1">List</a>
這里你或許會疑惑,為什么這里輸出的路徑是/admin/Admin,明明指定了action參數,理應是/admin/Admin/Index,這個時候
我們可以打開Areas/admin/adminAreaRegistration.cs文件,如下:
1 namespace MvcStudy.Areas.admin 2 { 3 public class adminAreaRegistration : AreaRegistration 4 { 5 public override string AreaName 6 { 7 get 8 { 9 return "admin"; 10 } 11 } 12 13 public override void RegisterArea(AreaRegistrationContext context) 14 { 15 context.MapRoute( 16 "admin_default", 17 "admin/{controller}/{action}/{id}", 18 new { action = "Index", id = UrlParameter.Optional } 19 ); 20 } 21 } 22 }
你可以清楚的看到 new {action = "Index" , id = UrlParameter.Optional},關鍵就在這,因為注冊路由的時候已經指定了action的默認
值為Index,所以在上面我們輸出路徑的時候只輸出了區域和控制器卻沒有方法。
上面我們僅僅只是簡單的輸出了鏈接,但是如今很多網站都會采用樣式等等。那么我們如何給這個鏈接添加樣式呢?
下面我們簡單的給一個鏈接添加一個class樣式:
1 @Html.ActionLink("Index", "Index", new { area = "admin", controller = "Admin" }, new {@class = "cust",id = "123" }) 2 @Html.ActionLink("List", "List", new { id = "123" ,tid = "asd",asf= "1"})
在這里指定class的時候我們沒有直接寫class,因為class在C#中是關鍵字,所以我們需要加上@。
最終的結果如下:
1 <a class="cust" href="/admin/Admin" id="123">Index</a> 2 <a href="/Home/List/123?tid=asd&asf=1">List</a>
我們指定了class樣式和id,當然你也可以指定其他的更多的參數。最后還要介紹一個方法:@Html.RouteLink,采用它更加的靈活,
因為參數全部采用了匿名的方式,比如下面這段:
1 @Html.RouteLink("Route", new { controller = "Home", action = "Index", id = "123", sid = "asd" })
最終結果如下:
1 <a href="/Home/Index/123?sid=asd">Route</a>
如果你只想簡單的輸出鏈接的文本而不要a標簽,可以使用下面的方法:
@Url.Action
@Url.RouteUrl
在代碼中則可以使用:
Url.Action
Url.RouteUrl
到這里我們的路由部分就全部結束了,當然如果各位看客有需要解析路由原理的可以留言。
