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
}