In an ASP MVC 3 project i want to enable language switching.
The routing is defined like this:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithLanguage", // Route name
"{language}/{controller}/{id}/{slug}", // URL with parameters
new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Trying to switch languages (in _Layout.cshtml) works like this:
<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" })</li>
Instead of getting a URL like the following (after having selected Spanish)
.../es/ControllerName/ActionName
i ‘m getting this:
.../ControllerName/ActionName?Length=11
If i set the ActionLink to the following (notice the last null parameter):
<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" }, null)</li>
i get this:
.../ControllerName/ActionName?language=es
What am i missing?
Thanks in advance!
There are some issues with your routes registration
DefaultWithLanguageroute registration. It doesn’t allow you to specify the{action}. This means that this route will only match aDetailsaction (since you have specified it in the default values). Another issue is that you made the{id}parameter optional. But that’s impossible. Only the last parameter of a route can be optional. In your case it is followed by a{slug}parameter.So one possibility is the following:
and then:
If you wanted to add a
{slug}parameter then your{id}can no longer be optional:and then: