C# ASP.NET控制器的核心路由和索引操作
我正在尝试设置控制器的路由,同时也能够在不键入C# ASP.NET控制器的核心路由和索引操作,c#,asp.net-core,.net-core,asp.net-core-routing,C#,Asp.net Core,.net Core,Asp.net Core Routing,我正在尝试设置控制器的路由,同时也能够在不键入index的情况下导航索引,以下是我尝试的内容: 我的路线配置 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); 试试看#1 // My contr
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()...
问题:这不起作用,所有操作都可以在面板/admin
上访问,因此我得到一个错误,说多个操作匹配
即使将我的索引操作的路由设置为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
}
谢谢。参考
对于属性路由,您必须非常具体地描述所需的路由,以避免路由冲突。这也意味着您必须指定所有路由。与基于约定的路由不同
选项1
选项2
[路由(“~/panel/admin”)]
中的波浪号(~
)覆盖控制器上的路由前缀
提示
虽然在动作上使用多个路由看起来很强大,但它更好
保持应用程序的URL空间简单且定义良好。使用
仅在需要的情况下(例如,支持
现有客户
您是否尝试过[路由(“panel/admin/”)
?或者在全局应用程序启动级别设置路由?嗯,是的,我在两次尝试中都设置了。您还可以在Startup.cs中共享您的路由配置吗(或者如果您在Startup.cs中没有路由配置,就这么说)?@Rainbolt我添加了它。您可能不需要在控制器级别设置路由。相反,您只需要将它们应用于操作方法。动作路线基本上都会附加到控制器路线上。我想这是最好的,我喜欢你的选择#2。谢谢你抽出时间!
[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
}
[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
}