MVC路由冲突问题

时间:2011-07-25 23:19:14

标签: asp.net-mvc asp.net-mvc-3

我有一个多语言的MVC应用程序,其中包括一些由页面控制器处理的简单“CMS”页面。我定义的路线是:

routes.MapRoute(
    "Page",
    "Page/{name}",
    new { controller = "Page", action = "Index", name = "" }
);

我还有一个在“基本控制器”中定义的方法,用于更改当前页面的语言。

public ActionResult ChangeCulture(Culture lang, string returnUrl)
{
    if (returnUrl.Length >= 3)
    {
        returnUrl = returnUrl.Substring(3);
    }

    return Redirect("/" + lang.ToString() + returnUrl);
}

例如,对于英语中的“关于我们”页面,可通过以下URL获得西班牙语版本: http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs

问题是这个URL映射到我为CMS页面定义的路由,这显然不存在。有没有办法可以忽略URL“Page / ChangeCulture”,所以它映射到正确的方法,即“基本控制器”中定义的方法?

谢谢,

2 个答案:

答案 0 :(得分:0)

您可以尝试在名称参数上设置route constraint

routes.MapRoute(
                "Page",
                "Page/{name}",
                new { controller = "Page", action = "Index", name = "" },
                new { name = new PageNameConstraint() }
                );

答案 1 :(得分:0)

您应该重新设计您的网址。为什么“关于我们”页面的西班牙语版本在不同的URL中提供?在您的示例中:

  1. http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs
  2. http://localhost/es/Page/AboutUs
  3. 使用一致的URL(在本例中为第二个)使每个页面都能在每种语言中工作。 您的路由将如下所示:

        routes.MapRoute(
        "Page",
        "{lang}/Page/{name}",
        new { controller = "Page", lang = "en", action = "Index", name = "" }
    );
    

    您甚至可以拨打RedirectToaction而不是Redirect,并使用更强大的构建网址的形式。例如:

    RedirectToAction("Index", new { page = "AboutUS", lang = "es" } );