从HtmlHelper中创建URL

时间:2009-05-13 15:18:46

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

我正在创建一个HtmlHelper扩展,它应该创建一组指向当前URL的链接,但是它们的语言代码与第一个参数不同。 语言代码作为列表传递。

目前我需要传递UrlHelper并执行以下操作:

/*Warning: HACK*/
RouteValueDictionary vals = html.ViewContext.RouteData.Values;
vals["siteLanguage"] = "replaceMe";
string siteLanUrl = url.RouteUrl(vals).Replace("replaceMe", "{0}");
/*ENDHACK*/

然后我进行字符串替换,以便“{0}”可以替换为我拥有的语言代码集。

由于种种原因,这种情况很糟糕但很难看。但我不知道我怎么能用HtmlHelper生成这些网址。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我为此创建了一个帮手...

public static string LanguageLink(this HtmlHelper html, string text, string languageCode)
{
    var routeValues = new RouteValueDictionary(html.ViewContext.RouteData.Values);
    routeValues["languageCode"] = languageCode;

    string action = routeValues["action"].ToString();
    return html.ActionLink(text, action, routeValues);
}

..然后在你的母版页(或任何地方)......

 <%= Html.LanguageLink("English", "en") %> 
 <%= Html.LanguageLink("Spanish", "es") %> 
 <%= Html.LanguageLink("German", "de") %> 
 <%= Html.LanguageLink("French", "fr") %> 

这些将链接到相同的控制器/动作&amp;路线值但会添加语言代码。要使这些生成友好的URL,您可以将此添加到默认路由

之上
 routes.MapRoute(
     "languageRoute",                                       
     "{languageCode}/{controller}/{action}/{id}",           
     new { controller = "Home", action = "Index", id = "" },
     new { languageCode = @"\w{2}" }
 );

(使用此路线,您将无法匹配名称为2个字符的任何控制器,但这可能没问题。)