C# 在ASP.net 5 MVC 6中,如何在不同的命名空间中使用相同的控制器名称

C# 在ASP.net 5 MVC 6中,如何在不同的命名空间中使用相同的控制器名称,c#,asp.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,C#,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我在不同的命名空间中定义了两个具有相同控制器名称的控制器。有个例外。如何使用uer参数“dataTokens”来定义控制器的名称空间,如mvc-4 以下例外情况: AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied: Alice.Controllers.TestController.Index

我在不同的命名空间中定义了两个具有相同控制器名称的控制器。有个例外。如何使用uer参数“dataTokens”来定义控制器的名称空间,如mvc-4

以下例外情况:

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

Alice.Controllers.TestController.Index
Alice.Controllers.Api.TestController.Index
Microsoft.AspNet.Mvc.Infrastructure.DefaultActionSelector.SelectAsync(RouteContext context)
控制器/Api/TestController.cs:

namespace Alice.Controllers.Api
{
    //[Route("api/[controller]")]
    public class TestController : Controller
    {
        //[Route("[action]")]
        public string Index()
        {
            return "this is controller at Alice.Controllers.Api"; ;
        }
    }
}
namespace Alice.Controllers
{
    //[Route("[controller]")]
    public class TestController : Controller
    {
        //[Route("[action]")]
        public string Index()
        {
            return "this is controller at Alice.Controllers";
        }
    }
}
控制器/TestController.cs:

namespace Alice.Controllers.Api
{
    //[Route("api/[controller]")]
    public class TestController : Controller
    {
        //[Route("[action]")]
        public string Index()
        {
            return "this is controller at Alice.Controllers.Api"; ;
        }
    }
}
namespace Alice.Controllers
{
    //[Route("[controller]")]
    public class TestController : Controller
    {
        //[Route("[action]")]
        public string Index()
        {
            return "this is controller at Alice.Controllers";
        }
    }
}
Startup.cs

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action}",
                defaults: null,
                constraints: null,
                dataTokens: new { Namespaces = new[] { "Alice.Controllers" } });

            routes.MapRoute(
                name: "api",
                template: "api/{controller}/{action}",
                defaults: null,
                constraints: null,
                dataTokens: new { Namespaces = new[] { "Alice.Controllers.Api" } });
        });

如果需要更多详细信息,请询问。

名称空间不是MVC功能。控制器只是类。如果您需要两个基本相同的控制器,那么可以从一个公共类派生它们,并将它们放在您想要的名称空间中。

不幸的是,默认情况下,在ASPNET MVC区域中(或在区域和应用程序根之间)不能有重复的控制器名称。幸运的是,解决方法非常简单,异常描述了您需要采取的步骤。添加区域后,将有两个不同的位置(默认情况下)定义路由:一个在根应用程序中,另一个在区域注册中。您需要调整这两个参数以指定名称空间参数。 startUp.cs

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "areaRoute",
                template: "{area:exists:regex(^(?!Main$).)}/{controller=Home}/{action=Index}/{id?}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}",
                defaults: new { area = "Main"});
        });
区域:主//区域默认值:localhost/home/index

namespace Exzen.Areas.Main.Controllers
{
    [Area("Main")]    
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}
namespace Exzen.Areas.Test.Controllers
{
    [Area("Test")]    
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}
区域:Test//area plus:localhost/Test/home/index

namespace Exzen.Areas.Main.Controllers
{
    [Area("Main")]    
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}
namespace Exzen.Areas.Test.Controllers
{
    [Area("Test")]    
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

我建议您将MVC应用程序从API应用程序拆分为两个不同的程序集。这只是一个演示。它也适用于“RouteAttribute”,但在Mvc-4中,我们可以使用名称空间定义路由。没有理由在Mvc-6中删除此函数。@janhartmann@Anik1991感谢您的帮助。这真的解决了我的问题。