在 ASP.net 5 MVC 6 中,如何在不同的命名空间中使用相同的控制器名称
In ASP.net 5 MVC 6 , How to use same controller name in different namespaces
我在不同的命名空间中定义了两个具有相同控制器名称的控制器。并得到一个例外。如何使用参数 "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)
Controllers/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"; ;
}
}
}
Controllers/TestController.cs :
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 功能。控制器只是 classes。如果你需要两个基本相同的控制器,那么从一个公共的 class 派生它们并将它们放在你想要的任何命名空间中。
不幸的是,默认情况下您不能在 ASPNET MVC 区域中(或区域与应用程序的根之间)具有重复的控制器名称。幸运的是,对此的修复非常简单,异常描述了您需要采取的步骤。一旦你添加了一个区域,你将有两个不同的地方(默认情况下)定义路由:一个在你的根应用程序中,一个在你的区域注册中。您将需要调整它们以指定名称空间参数。
more details check here
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"});
});
Areas:Main // 区域默认值:localhost/home/index
namespace Exzen.Areas.Main.Controllers
{
[Area("Main")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
Areas:Test// 面积加上:localhost/test/home/index
namespace Exzen.Areas.Test.Controllers
{
[Area("Test")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
我在不同的命名空间中定义了两个具有相同控制器名称的控制器。并得到一个例外。如何使用参数 "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)
Controllers/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"; ;
}
}
}
Controllers/TestController.cs :
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 功能。控制器只是 classes。如果你需要两个基本相同的控制器,那么从一个公共的 class 派生它们并将它们放在你想要的任何命名空间中。
不幸的是,默认情况下您不能在 ASPNET MVC 区域中(或区域与应用程序的根之间)具有重复的控制器名称。幸运的是,对此的修复非常简单,异常描述了您需要采取的步骤。一旦你添加了一个区域,你将有两个不同的地方(默认情况下)定义路由:一个在你的根应用程序中,一个在你的区域注册中。您将需要调整它们以指定名称空间参数。 more details check here
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"});
});
Areas:Main // 区域默认值:localhost/home/index
namespace Exzen.Areas.Main.Controllers
{
[Area("Main")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
Areas:Test// 面积加上:localhost/test/home/index
namespace Exzen.Areas.Test.Controllers
{
[Area("Test")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}