我正在使用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”))?
答案 0 :(得分:3)
不幸的是,MVC Core属性路由中没有默认操作的概念。您的替代方案是:
在中间件中创建可以指定默认操作的路径:
routes.MapRoute(
name: "invoice-categories",
template: "{area}/invoice-categories/{action=Index}/{id?}",
defaults: new { area = "admin", controller = "InvoiceCategories" });
在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
操作没有问题,但要删除消除歧义,您需要具体Route
,HttpGet
,HttpPost
,等你的其他行动。