我正在尝试设置控制器的路由,同时还能够导航索引而无需键入Index
,这是我尝试的方法:
我的路线配置
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
尝试#1
// My controller
[Route("panel/admin")]
public class MyController...
// My index action
public IActionResult Index()...
问题:这不起作用,所有操作都可以在panel/admin
上访问,因此我收到一条错误消息,说Multiple actions matched
。
即使将索引操作的路由设置为Route("")
,也不会更改任何内容。
尝试#2
// My controller
[Route("panel/admin/[action]")]
public class MyController...
// My index action
[Route("")]
public IActionResult Index()...
在这里,索引路由没有改变,而是停留在panel/admin/Index
。
我想要的
导航到panel/admin
时,我希望能够访问索引操作,并且我希望其他操作仅使用其方法名,例如panel/admin/UsersList
。
完整的控制器
[Route("panel/admin/[action]")]
public class MyController
{
[Route("")]
public IActionResult Index()
{
return View();
}
public IActionResult UsersList()
{
var users = _db.Users.ToList();
return View(users);
}
// Other actions like UsersList
}
谢谢。
答案 0 :(得分:0)
引用Routing to controller actions in ASP.NET Core
使用属性路由,您必须非常详细地了解所需路由,以避免路由冲突。这也意味着您必须指定所有路线。与基于约定的路由不同。
选项1
[Route("panel/admin")]
public class MyController {
[HttpGet]
[Route("")] //GET panel/admin
[Route("[action]")] //GET panel/admin/index
public IActionResult Index() {
return View();
}
[HttpGet]
[Route("[action]")] //GET panel/admin/UsersList
public IActionResult UsersList() {
var users = _db.Users.ToList();
return View(users);
}
// Other actions like UsersList
}
选项#2
[Route("panel/admin/[action]")]
public class MyController {
[HttpGet] //GET panel/admin/index
[Route("~/panel/admin")] //GET panel/admin
public IActionResult Index() {
return View();
}
[HttpGet] //GET panel/admin/UsersList
public IActionResult UsersList() {
var users = _db.Users.ToList();
return View(users);
}
// Other actions like UsersList
}
~
中的波浪号([Route("~/panel/admin")]
)会覆盖控制器上的路由前缀。
提示
在动作上使用多条路线看似功能强大,但效果更好 保持应用程序的URL空间简单明了。采用 仅在需要时(例如,需要支持)采取多种行动路线 现有客户。