控制器的ASP.NET Core路由和索引操作

时间:2018-07-02 18:13:01

标签: c# asp.net-core asp.net-core-routing

我正在尝试设置控制器的路由,同时还能够导航索引而无需键入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

}

谢谢。

1 个答案:

答案 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空间简单明了。采用   仅在需要时(例如,需要支持)采取多种行动路线   现有客户。