如何在 ASP.NET MVC 5 中设置 2 个路由指向同一个控制器

How to set 2 routes point to the same controller in ASP.NET MVC 5

我有一个 ASP.NET MVC 5 网站,它有一个控制器 MyFirstController

这样,我可以使用 https://example.server.com/MyFirst.

加载索引视图

另一方面,我有另一个视图以这种方式呈现 link(HTML 标记的 HREF 属性):

Url.Action("Index", "MyFirst")

URL 渲染导致生成 link:

https://example.server.com/MyFirst 

到目前为止,还不错。现在,我需要一条类似这样的路线

https://example.server.com/MySecond

URL 应加载 MyFirst 控制器的相同 Index 视图,而无需创建名为 MySecondController 的新控制器。这就像有一个名为 MySecond.

MyFirst 控制器别名

RouteConfig.cs 文件中我添加了这个:

routes.MapRoute(name: "MySecond",
                url: "MySecond/{action}/{id}",
                defaults: new { controller = "MyFirst", action = "Index", id = UrlParameter.Optional }
               );

我对这段代码的问题是我在另一个视图中有这段渲染代码:

@if (somecondition)
{
    ... Url.Action("Index", "MyFirst") ...
}
else
{
    ... Url.Action("Index", "MySecond") ...
}

我需要如果 somecondition 为真,渲染的 URL 为 https://example.server.com/MyFirst,如果为假,渲染的 URL 为 https://example.server.com/MySecond.

我遇到的问题是两者都被呈现为 https://example.server.com/MySecond

我怎样才能完成这个任务?

不使用Url.Action,而是使用Url.Route,因为它允许显式传递路由名称以申请呈现url.

要呈现 /MySecond url,请传递 MySecond 路由的名称。

@Url.RouteUrl("MySecond")

/MyFirst url 执行相同的操作,但由于它没有明确的路由名称,因此您必须同时传递默认路由的名称和名称MyFirst 控制器。

@Url.RouteUrl("Default", new { Controller = "MyFirst" })

您可以省略 Index 操作的名称,因为它已被设置为默认操作。

自定义路由应该在默认路由之前。

routes.MapRoute(
                "MySecond",                                          
                "MySecond/{action}/{id}",                            
                new { controller = "MyFirst", action = "Index",id = UrlParameter.Optional  }
            );

routes.MapRoute(
                "Default",                                              
                "{controller}/{action}/{id}",                           
                new { controller = "Home", action = "Index", id = "" }  
            );

在控制器中尝试使用

[Route("MyFirst")]
[Route("MySecond")]
public class MyFirstController : Controller
{
  
}

使用 Url.Route 而不是 Url.Action。此方法可以选择提供路由名称以及可选的操作和控制器。

if (somecondition)
{
    @Url.RouteUrl("Default", new { Controller = "MyFirst" }) //Action "Index" will be defaulted so do not need to provide it
}
else
{
    Url.RouteUrl("MySecond");
}

您还可以在 UrlHelper 上创建扩展方法,这样您的视图中就不会出现乱七八糟的“魔法字符串”:

namespace MyWebsite.Helpers
{
    public static class UrlHelperExtension
    {
        public static string MyFirst(this UrlHelper url)
        {
            return url.RouteUrl("Default", new { Controller = "MyFirst" });
        }

        public static string MySecond(this UrlHelper url)
        {
            return url.RouteUrl("MySecond");
        }
    }
}

那么你可以使用@Url.MyFirst()@Url.MySecond()

您可以将 2 个路由点设置到同一个控制器,如下所示:

[Route("first_route")]
[Route("second_route")]
public class MyController : Controller{

}