同一控制器中的 AmbiguousActionException

AmbiguousActionException in same controller

我一直在尝试 Asp.NET 核心,特别是领域。现在我 运行 遇到一个问题,如果我向我的控制器添加多个视图,我会得到一个异常。

这是我的例外:

An unhandled exception occurred while processing the request.

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

Forum.Areas.Admin.Controllers.AdminController.Index (Forum) Forum.Areas.Admin.Controllers.AdminController.Testing (Forum)

这是我注册路线的方式:

  app.UseMvc(routes =>
  {
    routes.MapRoute("adminRoute", "Admin/{controller}/{action}/{id?}");

    routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}");
  });

我的控制器:

namespace Forum.Areas.Admin.Controllers
{
  [Area("Admin")]
  [Route("admin")]
  public class AdminController : Controller
  {

    public IActionResult Index()
    {
      return View();
    }

    public IActionResult Testing()
    {
      return Content("Testing area!");
    }
  }
}

我的项目结构:

其他类似的问题似乎对不同的控制器有模棱两可的动作,但在我的情况下是两个不同的动作名称?我是不是记错了路线?

编辑:请不要评论我的“制表符的 2 个空格”缩进 - 这是工作中的风格指南,我没有发言权:(

提前致谢!

首先,你不需要 AdminController 中的 Route 属性,因为你在 app.UseMvc() 中注册了路由 - 删除 [Route("admin")].

此外,您应该在 app.UseMvc() 更改路线。

这条路线:

routes.MapRoute("adminRoute", "Admin/{controller}/{action}/{id?}");

应改为:

routes.MapRoute("adminRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");

需要在路由中设置区域,controlleraction需要设置默认值(不需要设置默认值,后面的回答会说明)

因此,要调用 Index() 操作,您应该键入此 url:

http://localhost:yourPortNumber/Admin

此处您向 Admin 区域发出请求并使用默认值(Admin 作为默认控制器,Index 作为默认操作)。您可以更改此路由的默认值。

注意: 如果您没有在路由中设置默认值,那么之前的 link 将不起作用,您应该写完整的 url 到 action - 见下文。

要调用 Testing() 操作 url 应该是:

http://localhost:yourPortNumber/Admin/Admin/Testing

此处指定区域名称(Admin)、控制器名称(Admin)和操作名称(Testing)

通过同样的方式你可以调用Index()动作和其他动作(如果你需要更多的话):

http://localhost:yourPortNumber/Admin/Admin/Index

http://localhost:yourPortNumber/Admin/Admin/AntoherActionName

所以,你的路由应该这样配置:

app.UseMvc(routes =>
{
  routes.MapRoute("adminRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");

  routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

和您的控制器:

[Area("Admin")]  
public class AdminController : Controller
{     
  public IActionResult Index()
  {
    return View();
  }

  public IActionResult Testing()
  {
    return Content("Testing area!");
  }
}

编辑:

您也可以在路由配置中设置默认区域:

routes.MapRoute("adminRoute", "{area=Admin}/{controller=Admin}/{action=Index}/{id?}");

现在,当您 运行 您的应用默认将使用路由:

http://localhost:your_port_number/Admin/Admin/Index