【问题标题】:ASP.NET Core route of a controller and the index action控制器的 ASP.NET Core 路由和索引操作
【发布时间】:2018-07-02 18:13:01
【问题描述】:

我正在尝试设置我的控制器的路线,同时也能够在不输入 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

}

谢谢。

【问题讨论】:

  • 你试过[Route("panel/admin/")]吗?还是在 global-app-start 级别设置路由?
  • 嗯,是的,我两次都试过了。
  • 能否也分享你在 Startup.cs 中的路由配置(或者如果你在 Startup.cs 中没有路由配置,就这么说吧)?
  • @Rainbolt 我加了。
  • 您可能不必在控制器级别设置路由。相反,您只需将它们应用于操作方法。动作路由基本上总是附加到控制器路由。

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


【解决方案1】:

参考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 空间简单且定义明确。采用 仅在需要时执行多条路线,例如支持 现有客户。

【讨论】:

  • 我想这是最好的,我喜欢你的选项#2。感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
相关资源
最近更新 更多