Asp.net-Mvc-Routing

MVC 5 中的屬性路由和可選預設值

  • January 26, 2016

傳統的路由預設值意味著我們能夠訪問這些 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控制器上的屬性不會生效。

引用自:https://stackoverflow.com/questions/20522241