gpt4 book ai didi

c# - 同一 Controller 中的 AmbiguousActionException

转载 作者:太空狗 更新时间:2023-10-30 01:14:40 26 4
gpt4 key购买 nike

我一直在试用 Asp.NET Core,特别是区域。现在我遇到了一个问题,如果我向我的 Controller 添加多个 View ,我会得到一个异常。

这是我的异常(exception):

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?}");
});

我的 Controller :

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!");
}
}
}

我的项目结构:

Project structure

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

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

提前致谢!

最佳答案

首先,你不需要AdminController中的Route属性,因为你在app.UseMvc()中注册了路由——删除[路由("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 作为默认 Controller ,Index 作为默认操作)。您可以更改此路由的默认值。

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

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

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

在这里指定区域名称(Admin)、 Controller 名称(Admin)和操作名称(Testing)

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

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?}");
});

和你的 Controller :

[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

关于c# - 同一 Controller 中的 AmbiguousActionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42245676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com