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

Rya*_*eir 5 c# asp.net-mvc routes html-helper

我有两个名称相同的控制器,其中一个位于"Admin"区域,另一个位于默认区域(我相信它可以解析为区域的空字符串).

以下电话:

HtmlHelper.Action("Action", "DuplicateController", new { parameterValue = "test" } );
Run Code Online (Sandbox Code Playgroud)

似乎无法解决我ProjectA.Controllers.DuplicateController和之间的区别ProjectB.Controllers.DuplicateController,即使我通过添加区域将其指定为"",如下所示:

HtmlHelper.Action("Action", "DuplicateController", new { parameterValue = "test", area = "" } );
Run Code Online (Sandbox Code Playgroud)

我知道我应该能够通过在应用程序启动时注册它们来指定路由来解决这个问题,但是是否可以直接向控制器指定一个完全限定的命名空间,我知道我需要在action方法中调用它?

例如以下内容可以解决我的问题:

HtmlHelper.Action("Action", "ProjectB.Controllers.DuplicateController", new { parameterValue = "test" } );
Run Code Online (Sandbox Code Playgroud)

Wil*_*iam 4

正如您所建议的,我相信您必须将命名空间添加到RouteConfig.cs文件和AdminAreaRegistration.cs文件中两个不明确控制器的路由中。有关示例,请参阅此 StackOverflow 帖子

因此,您可以将“ namespaces ”参数添加到默认路由,如上面的文章所示,或者为每个“重复”控制器创建一个路由。

在您的RouteConfig.cs中:

routes.MapRoute(
    name: "Duplicate",
    url: "Duplicate/{action}/{id}",
    defaults: new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MyMvcApplication.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)

在您的AdminAreaRegistration.cs中:

context.MapRoute(
    "Admin_Duplicate",
    "Admin/Duplicate/{action}/{id}",
    new { controller = "Duplicate", action = "Index", id = UrlParameter.Optional },
    new[] { "MyMvcApplication.Areas.Admin.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)