连字符友好URL路由

时间:2018-04-10 15:54:05

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0

我正在使用ASP.Net MVC Core 2.0并且很难让路由工作为带连字符的友好URL。我想要以下网址样式:

admin is the area:
    /admin/invoice-categories/new    - Creates a new invoice category
    /admin/invoice-categories/edit/1 - Edits a invoice category
    /admin/invoice-categories        - Shows the invoice categories list

这是我的控制器代码:

[Area("admin")]
[Route("[area]/invoice-categories/"]
class InvoiceCategoriesController {
   public IActionResult New() {}
   public IActionResult Edit(int id) {}
   public IActionResult Index() {}
}

但是,这会导致异常,说明控制器中的“新建,编辑,索引”方法不明确。

有没有办法让它工作而没有专门定义动作名称(比如HttpGet(“New”))?

2 个答案:

答案 0 :(得分:3)

不幸的是,MVC Core属性路由中没有默认操作的概念。您的替代方案是:

  1. 在中间件中创建可以指定默认操作的路径:

    routes.MapRoute(
        name: "invoice-categories",
        template: "{area}/invoice-categories/{action=Index}/{id?}",
        defaults: new { area = "admin", controller = "InvoiceCategories" });
    
  2. Index操作中添加额外路线:

    [Area("admin")]
    [Route("[area]/invoice-categories/[action]"]
    class InvoiceCategoriesController {
        public IActionResult New() {}
        public IActionResult Edit(int id) {}
    
        [Route("[area]/invoice-categories"]
        public IActionResult Index() {}
    }
    

答案 1 :(得分:3)

属性路由是一种全有或全无的事情,至少在单个控制器的上下文中(您可以在某些控制器上使用属性路由而不在其他控制器上使用)。关键是,一旦在控制器上指定路由,所有操作都需要指定路由,或者它们将默认为"",或者控制器本身的确切路由。

换句话说,您的Index操作没有问题,但要删除消除歧义,您需要具体RouteHttpGetHttpPost,等你的其他行动。