使用引用URL和语言选择重建Razor URL

时间:2014-05-20 14:17:11

标签: asp.net-mvc razor localization asp.net-mvc-routing nullreferenceexception

要在MVC Razor应用程序中实现语言选择,我在路由映射中使用前导路径段,如www.mydomain.com/lang/controller/action/id?param=,其中lang是2个字母的ISO国家/地区代码,如fr,de,it,en等

我使用以下路由映射(工作正常):

// Special localisation route mapping - expects specific language/culture code as first param
routes.MapRoute(
    name: "Localisation",
    url: "{lang}/{controller}/{action}/{id}",
    defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
    constraints: new { lang = @"[a-z]{2}|[a-z]{2}-[a-zA-Z]{2}" }
);

之前我在母版页中生成了我的语言选择链接,因此它们只是当前网址的变体(仅更改了第一个细分)。现在我需要能够在局部视图中创建链接,可以通过Ajax动态加载,菜单项(国家)是数据驱动的。

这意味着我需要使用引用URL(实际加载的页面)并修改它以为每种可用语言插入新语言。菜单项都是数据库驱动的,因此只包含2个字母的语言代码和显示名称。

Google搜索"如何将网址分隔为控制器和操作" 我在此处找到了一个有趣的链接:http://average-joe.info/url-to-route-data/

根据该链接,这是我尝试的内容,但它会在http://localhost:51176/之类的根网址或http://localhost:51176/en/home/index之类的完整网址上爆炸。我原以为它会返回默认值home(控制器)和index(操作)。相反,我得到一个Null引用异常。

    string path = Request.UrlReferrer.ToString();
    string queryString = "";  // Blank for now
    System.Web.Routing.RouteData routeFromUrl = System.Web.Routing.RouteTable.Routes.GetRouteData(new HttpContextWrapper(new HttpContext(new HttpRequest(null, new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, path).ToString(), queryString), new HttpResponse(new System.IO.StringWriter()))));

    // Blows up with Null exception as routeFromUrl is always null
    string controller = (string)routeFromUrl.Values["controller"];
    string action = (string)routeFromUrl.Values["action"];
    string id = (string)routeFromUrl.Values["id"];

然后,我可以使用引用控制器,操作和参数生成具有这些href值的链接,因此保持在同一页面上#34; (除了明显的语言变化):

http://localhost:51176/en/home/index
http://localhost:51176/de/home/index
http://localhost:51176/fr/home/index

我使用这段代码的方式出了什么问题(或者它是不是按照我的预期工作)?

1 个答案:

答案 0 :(得分:1)

Do'h ......这么简单。

只需提供URL 的路径部分,因为它使用当前的方案,主机&应用于该路径的端口。

string path = Request.UrlReferrer.AbsolutePath;

另请注意(有价值的提示):

如果您按照我的说明进行链接,就像我一样,您需要调整以下内容才能使用ToString(),因为它们在空时不会转换为字符串

string controller = routeFromUrl.Values["controller"].ToString();
string action = routeFromUrl.Values["action"].ToString();
string id = routeFromUrl.Values["id"].ToString();

这将按预期提供controller="home"action="index"id=""!呼