我有一个多语言的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”,所以它映射到正确的方法,即“基本控制器”中定义的方法?
谢谢,
何
答案 0 :(得分:0)
您可以尝试在名称参数上设置route constraint。
routes.MapRoute(
"Page",
"Page/{name}",
new { controller = "Page", action = "Index", name = "" },
new { name = new PageNameConstraint() }
);
答案 1 :(得分:0)
您应该重新设计您的网址。为什么“关于我们”页面的西班牙语版本在不同的URL中提供?在您的示例中:
使用一致的URL(在本例中为第二个)使每个页面都能在每种语言中工作。 您的路由将如下所示:
routes.MapRoute(
"Page",
"{lang}/Page/{name}",
new { controller = "Page", lang = "en", action = "Index", name = "" }
);
您甚至可以拨打RedirectToaction
而不是Redirect
,并使用更强大的构建网址的形式。例如:
RedirectToAction("Index", new { page = "AboutUS", lang = "es" } );