如何在 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{
}
我有一个 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{
}