同一控制器中的 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?}");
需要在路由中设置区域,controller
和action
需要设置默认值(不需要设置默认值,后面的回答会说明)
因此,要调用 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
我一直在尝试 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?}");
需要在路由中设置区域,controller
和action
需要设置默认值(不需要设置默认值,后面的回答会说明)
因此,要调用 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