我在不同的命名空间中定义了两个具有相同控制器名称的控制器。并得到一个例外。如何使用参数“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";
}
}
}
如果需要更多详细信息,请询问。
答案 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();
}
}
}