【问题标题】:In ASP.net 5 MVC 6 , How to use same controller name in different namespaces在 ASP.net 5 MVC 6 中,如何在不同的命名空间中使用相同的控制器名称
【发布时间】:2015-12-26 16:03:59
【问题描述】:

我在不同的命名空间中定义了两个具有相同控制器名称的控制器。并得到了一个例外。如何通过参数“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"; ;
        }
    }
}

控制器/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 应用从 API 应用拆分为两个不同的程序集。
  • 这只是一个演示。它也适用于“RouteAttribute”,但在 Mvc-4 中,我们可以使用命名空间定义路由。在 Mvc-6 中没有理由删除这个函数。@janhartmann

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


【解决方案1】:

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

【讨论】:

  • 感谢@Anik1991 的帮助。它确实解决了我的问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2017-10-16
      • 2017-05-18
      • 2018-03-27
      • 2016-08-13
      • 2015-04-12
      • 2018-06-13
      相关资源
      最近更新 更多