Asp.net-Mvc-Routing
MVC 5 中的屬性路由和可選預設值
傳統的路由預設值意味著我們能夠訪問這些 URL 並且總是以相同的操作結束:
/ /Home /Home/Index但是今天我們會在這些行中寫一些東西:
[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { public ActionResult Index() {} public ActionResult ... }但是這個路由定義絕不相同。
/ (fails) /Home (works) /Home/Index (works)因此,如果我們將上面的程式碼更改為
[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { [Route("~/")] public ActionResult Index() {} public ActionResult ... }但隨後我們將處理顛倒過來:
/ (works) /Home (fails) /Home/Index (fails)我們可以通過以下方式使聲明性程式碼更加冗長,並使其像老式路由機制一樣工作:
[RoutePrefix("Home")] [Route("{action=Index}")] public class HomeController { [Route("~/")] [Route("~/Home")] [Route("~/Home/Index")] public ActionResult Index() {} public ActionResult ... }這適用於所有三種不同的路線。
問題
這個問題當然與預設控制器和操作的*應用程序預設操作有關。*只是**我想知道這是否是唯一的方法?**有沒有更簡潔的程式碼方式讓它按預期工作?
是的,對……你所擁有的就是在這裡做的……
我在這裡稍微修改了程式碼:
[RoutePrefix("Home")] [Route("{action}")] public class HomeController { [Route("~/")] // GET / [Route] // GET /Home [Route("Index")] // GET /Home/Index public ActionResult Index() {} public ActionResult ... }一些細節:
1.您的第一種情況與傳統路由不完全相同,因為在這種情況下,您有一個文欄位
Home,它與 的傳統路由選項不相似{controller}/{action}/{id} and controller = Home, action=Index,id=optional。2.如果在動作上使用屬性,則您的第二種情況是設計預期的,而
Route控制器上的屬性不會生效。