ASP.NET MVC多个url指向同一个动作

时间:2010-08-27 12:37:09

标签: c# asp.net-mvc-2 asp.net-mvc-routing

如何将多个网址映射到asp.net mvc中的相同操作

我有:

string url1 = "Help/Me";
string url2 = "Help/Me/Now";
string url3 = "Help/Polemus";
string url1 = "Help/Polemus/Tomorow";

在我的global.asax.cs文件中,我想将所有这些网址映射到以下操作:

public class PageController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
}

4 个答案:

答案 0 :(得分:23)

现在在MVC 5中,这可以通过使用路由属性来实现。

[Route("Help/Me")]
[Route("Help/Me/Now")]
[Route("Help/Polemus")]
[Route("Help/Polemus/Tomorow")]
public ActionResult Index()
 {
    return View();
 }

答案 1 :(得分:8)

将以下行添加到路由表中:

routes.MapRoute("RouteName", "Help/{Thing}/{OtherThing}", new { controller = "Page" });

修改

foreach(string url in urls)
    routes.MapRoute("RouteName-" + url, url, new { controller = "Page", action = "Index" });

答案 2 :(得分:5)

在我的情况下,我希望简单地将两条“硬编码”路线合并为一条并偶然发现这篇文章。我想稍微清理一下RouteConfig.cs - 因为它有很多相似的路线。

我最终在正则表达式中使用了一些简单的'或'逻辑,并且基本上已经改变了:

routes.MapRoute(
    "UniqueHomePage",
    "Default",
    new { controller = "Redirector", action = "RedirectToRoot" }
);

routes.MapRoute(
    "UniqueHomePage2",
    "Home",
    new { controller = "Redirector", action = "RedirectToRoot" }
);

进入单一路线:

routes.MapRoute(
    "UniqueHomePageGeneric",
     "{url}",
      new { controller = "Redirector", action = "RedirectToRoot" },
      new { url = "Home|Default" }
);

注意SEO-savy或-interested:将多个URL指向同一个动作的原因是,然后再将它们重定向到同一个页面。在这种情况下的主页。因此,我们的想法是防止重复的内容问题。当您使用此方法指向非重定向操作,但显示自己的视图的操作时,您可能会导致重复的内容问题:P。

答案 3 :(得分:3)

您可以根据需要将路线添加到路线表中,与任何其他路线相同。只需给它们唯一的名称,硬编码的URL并指向相同的控制器/动作。它会工作正常。

如果您使用模式匹配而不是硬编码网址,请确保以正确的顺序获取所有路由,以便从列表中选择正确的路由。因此,如果硬编码路由转到匹配模式的不同页面,则/ Help / Me应出现在/ Help / {Page}之前。如果你将/ help / {page}放在路由选项卡1st中,这将与/ help / me匹配,并且你的硬编码命名操作永远不会触发。

另一方面,如果这是一个面向公众的网站,SEO很重要请注意,如果您有多个网址返回相同的数据,它将被标记为重复。如果是这种情况,请使用Canonical标记,这会将所有转到该单个网页的网址中的所有网页排名提供给您指定的网页,并为您删除重复的内容问题。