Come promesso in questa guida - e richiesto a gran voce dai nostri lettori - pubblichiamo un Extension Method che consente di utilizzare il metodo helper Url.Action all'interno di una View in Razor specificando, in aggiunta ai consueti parametri, un oggetto CultureInfo che verrà utilizzato internamente per costruire una URL localizzata. Ovviamente, affinché la URL venga correttamente gestita dalla nostra applicazione, sarà necessario implementare una Route con supporto multi-language come quella pubblicata in questo post.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; using System.Globalization; using System.Web.Mvc; namespace Ryadel.Web.Mvc.Extensions { public static class UrlHelperExtensions { /// <summary> /// Extension method to handle localized URL using a dedicated, multi-language custom route. /// for additional info, read the following post: /// https://www.ryadel.com/en/setup-a-multi-language-website-using-asp-net-mvc/ /// </summary> public static string Action( this UrlHelper helper, string actionName, string controllerName, object routeValues, CultureInfo cultureInfo) { // fallback if cultureInfo is NULL if (cultureInfo == null) cultureInfo = CultureInfo.CurrentCulture; // arrange a "localized" controllerName to be handled with a dedicated localization-aware route. string localizedControllerName = String.Format("{0}/{1}", cultureInfo.TwoLetterISOLanguageName, controllerName); // build the Action return helper.Action( actionName, localizedControllerName, routeValues); } } } |
Date a questa classe un nome adeguato, come ad esempio UrlHelperExtensions.cs, quindi inseritela in un punto adeguato della vostra applicazione, ad es. all'interno di una cartella /AppCode/ . Ovviamente, dovrete anche includere i namespace necessari all'interno del web.config situato nella directory /Views/ :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Linq" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Optimization"/> <add namespace="System.Web.Routing" /> <add namespace="System.Globalization" /> <add namespace="Ryadel.Web.Mvc.Extensions" /> </namespaces> </pages> </system.web.webPages.razor> |
Nel nostro esempio il namespace si chiama Ryadel.Web.Mvc.Extensions, ma potete cambiarlo a vostro piacimento.
Una volta creata e impostata correttamente, l'estensione potrà essere utilizzata all'interno di qualsiasi View Razor nel seguente modo:
1 |
@Url.Action("actionName", "controllerName", null, (CultureInfo)null) |
Nell'esempio l' oggetto CultureInfo viene impostato volutamente a null, in quanto il metodo è pensato per recuperare e utilizzare l'istanza predefinita in quel caso: se avete implementato la logica multi-language seguendo la nostra guida non sarà necessario aggiungere altro.
Nel caso in cui vogliate approfittarne per creare una estensione analoga anche per il metodo Html.ActionLink, potete approfittarne leggendo questo articolo.