[英]ASP.NET MVC - Nesting Routes / Controllers
我有一個ASP.NET MVC應用程序。 我見過類似的問題。 但是,我還沒有找到一個好的答案。 基本上,我想使用以下路由:
/admin/users
/admin/users/create
/admin/users/[someId]
/admin/roles
/admin/roles/create
/admin/roles/[someId]
我有以下文件結構:
/Controllers
AdminController.cs
/Admin
UsersController.cs
RolesController.cs
/Views
/Admin
Index.cshtml
/Users
Index.cshtml
Detail.cshtml
Create.cshtml
/Roles
Index.cshtml
Create.cshtml
Detail.cshtml
當我運行我的應用程序時,我只是得到了The resource cannot be found.
我究竟做錯了什么? 我設置了斷點,但沒有一個被擊中。 這就像路由沒有映射到控制器。 我不確定我需要做什么。
您無需為此創建子文件夾。 只需要2個控制器( UsersController
和RolesController
),您就可以使用屬性路由來定義所需的自定義路由模式。
假設您已啟用屬性路由
public class UsersController : Controller
{
[Route("admin/users")]
public ActionResult Index() { // to do : Return something }
[Route("admin/users/create")]
public ActionResult Create() { // to do : Return something }
[Route("admin/users/{id}")]
public ActionResult View(int id) { // to do : Return something }
}
或者您可以在控制器級別上執行RoutePrefix
。
[RoutePrefix("admin/users")]
public class UsersController : Controller
{
[Route("")]
public ActionResult Index() { // to do : Return something }
[Route("create")]
public ActionResult Create() { // to do : Return something }
[Route("{id}")]
public ActionResult View(int id) { // to do : Return something }
}
你也可以為RolesControllers做同樣的事情。
您可以在RouteConfig.cs
文件的RegisterRoutes
方法中啟用屬性路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(); //This line enables attribute routing
//Existing default Route definition goes here
}
您也可以考慮創建一個“管理”區域並將控制器置於其中。 如果要對邏輯上的類似功能進行分組,則區域是正確的解決方案。
如果您不喜歡屬性路由(為什么不呢?),您可以在RouteConfig中定義這些自定義路由模式。 您定義路線的順序很重要。因此,請確保在默認通用路線之前定義您的特定路線 。
您還可以通過使用RouteAttribute類修飾操作方法來覆蓋路由表。
例如:
class AdminController
{
[Route("/admin/users/create")]
public ViewResult CreateUser()
{
...
}
}
這具有將方法名稱與url組件分開的優點。
您還可以將多個URL路由到單個方法:
class AdminController
{
[Route("/admin/users/{someId:guid}")]
[Route("/admin/users/{someId:guid}/details")]
public ViewResult UserDetails(Guid someID)
{
...
}
}
正如梅森所說,文件結構在MVC路由中並不重要。
如果要使用基於約定(文件夾)的路由,可以使用MvcCodeRouting完成您在此處指定的操作。 它默認使用命名空間,因此當您在層次結構中添加控制器時,它將自動生成同一層次結構中的路由。 無需在任何地方應用[Route]
屬性並手動設置路線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.