C# 如何指定要在HtmlHelper.Action(字符串、字符串、对象)中调用的控制器的命名空间?

C# 如何指定要在HtmlHelper.Action(字符串、字符串、对象)中调用的控制器的命名空间?,c#,asp.net-mvc,routes,html-helper,C#,Asp.net Mvc,Routes,Html Helper,我有两个名称相同的控制器,其中一个位于“Admin”区域,另一个位于默认区域(我相信这会解析为区域的空字符串) 以下电话: HtmlHelper.Action("Action", "DuplicateController", new { parameterValue = "test" } ); 似乎无法解决myProjectA.Controllers.DuplicateController和ProjectB.Controllers.DuplicateController之间的差异,即使我通过如

我有两个名称相同的控制器,其中一个位于“Admin”区域,另一个位于默认区域(我相信这会解析为区域的空字符串)

以下电话:

HtmlHelper.Action("Action", "DuplicateController", new { parameterValue = "test" } );
似乎无法解决my
ProjectA.Controllers.DuplicateController
ProjectB.Controllers.DuplicateController
之间的差异,即使我通过如下添加将区域指定为“”:

HtmlHelper.Action("Action", "DuplicateController", new { parameterValue = "test", area = "" } );
我知道我应该能够通过在应用程序启动时注册路由来解决这个问题,但是是否可以直接为我知道需要在action方法中调用的控制器指定完全限定的命名空间

e、 g.以下类似的方法可以解决我的问题:

HtmlHelper.Action("Action", "ProjectB.Controllers.DuplicateController", new { parameterValue = "test" } );

正如您所建议的,我相信您必须为RouteConfig.cs文件和AdminAreaRegistration.cs文件中的两个模糊控制器的路由添加名称空间。有关示例,请参见

因此,您可以将“名称空间”参数添加到默认路由,如上文所述,或者为每个“重复”控制器创建一个路由

在您的路线图.cs中:

routes.MapRoute(
    name: "Duplicate",
    url: "Duplicate/{action}/{id}",
    defaults: new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MyMvcApplication.Controllers" }
);
context.MapRoute(
    "Admin_Duplicate",
    "Admin/Duplicate/{action}/{id}",
    new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    new[] { "MyMvcApplication.Areas.Admin.Controllers" }
);
在您的AdminAreaRegistration.cs中:

routes.MapRoute(
    name: "Duplicate",
    url: "Duplicate/{action}/{id}",
    defaults: new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MyMvcApplication.Controllers" }
);
context.MapRoute(
    "Admin_Duplicate",
    "Admin/Duplicate/{action}/{id}",
    new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    new[] { "MyMvcApplication.Areas.Admin.Controllers" }
);

谢谢,我最后就是这么做的。我假设在helper方法中不允许使用名称空间参数的原因是路由应该负责所有到控制器操作的映射,原则上我同意这一点,但在这种情况下不太方便。