簡體   English   中英

ASP.NET MVC - 嵌套路由/控制器

[英]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個控制器( UsersControllerRolesController ),您就可以使用屬性路由來定義所需的自定義路由模式。

假設您已啟用屬性路由

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM