0

I'm creating a HtmlHelper extention that should create a set of links pointing to the current URL, but that have a different language code as their first parameter. The languagecodes are passed in as a list.

Currently I require the UrlHelper to be passed in and do the following:

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

Then I do a string replace so the "{0}" can be replaced with the set of language codes I have.

This is off course but ugly for a multitude of reasons. But I don't know how else I can generate these urls from with the HtmlHelper. Any suggestions?

1 Answer 1

1

I'd create a helper for this...

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);
}

.. then in your master page (or wherever)...

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

These will link to the same controller/action & route values but will add the language code. To get these to generate a friendly URL, you can add this above the default route.

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

(With this route, you wouldn't be able to match any controllers with a name of 2 characters, but that's probably fine).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.