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

时间:2015-12-26 16:04:00

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

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

以下例外:

static void Main(string[] args)
{
    Item item1 = new Item("Ball", 9.99, "This is a ball");
    Item item2 = new Item("Toy Car", 20.00, "This is a toy car");
    List<Item> items = new List<Item>();

    items.Add(item1);
    items.Add(item2);

    foreach (Item s in items)
    {
        Console.WriteLine(s);
    }
}

Controllers / Api / TestController.cs:

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)

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

Startup.cs

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

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

3 个答案:

答案 0 :(得分:2)

不幸的是,默认情况下,ASPNET MVC区域(或区域和应用程序的根目录之间)不能有重复的控制器名称。幸运的是,对此的修复非常简单,异常描述了您需要采取的步骤。添加区域后,您将在两个不同的位置(默认情况下)定义路径:一个位于根应用程序中,另一个位于区域注册位置。您需要调整它们以指定命名空间参数。 more details check here

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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();
        }
    }
}

区域:测试//区域加:localhost / test / home / index

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