ASP.NET MVC рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

ASP.NET MVC рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдПрд▓реЗрдХреНрд╕ рдПрдбрдореИрди рд╕реЗ рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдпрджреНрдпрдкрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА ASP.NET MVC 2 рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм рдореИрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЗрд╕реЗ рд░реВрдЯрд┐рдВрдЧ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ URL рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рде рд╣реА, рдЗрд╕ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╡рд┐рдзрд┐ рдореЗрдВ OutputCache рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдХрд╛ URL / en / Home / About рдХреЗ URL рдкрддреЗ рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ / рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдлреЙрд░реНрдо / {рд╕рдВрд╕реНрдХреГрддрд┐} / {рдирд┐рдпрдВрддреНрд░рдХ} / {Action} ... рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред

рдЦреБрдж рдХрд╛ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдорд╛рдирдХ MvcRouteHandler рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред MultiCultureMvcRouteHandler рд╡рд░реНрдЧ рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд╕рдВрд╕реНрдХреГрддрд┐ рдорд╛рди рд▓реЗрдВрдЧреЗ рдФрд░ SingleCultureMvcRouteHandler рд╡рд░реНрдЧ (рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛, рдПрдХ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

public class MultiCultureMvcRouteHandler : MvcRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { var culture = requestContext.RouteData.Values["culture"].ToString(); var ci = new CultureInfo(culture); Thread.CurrentThread.CurrentUICulture = ci; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name); return base.GetHttpHandler(requestContext); } } 

рдУрд╡рд░рд░рд╛рдЗрдВрдб GetHttpHandler рд╡рд┐рдзрд┐ рдореЗрдВ , рдЗрд╕рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрд╕ рд░реВрдЯрдбреЗрдЯрд╛ рд╕рд░рдгреА рд╕реЗ "рд╕рдВрд╕реНрдХреГрддрд┐" рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХрд▓реНрдЪрд░рдЗрдиреНрдлреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреНрд░реАрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХреГрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд╕рдВрд╕реНрдХреГрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Global.asax рдореЗрдВ Application_AcquireRequestState рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

 public class SingleCultureMvcRouteHandler : MvcRouteHandler {} 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕реНрдХреГрддрд┐ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╣рдо рдорд╛рд░реНрдЧ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ

рдЕрдм Global.asax рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ RegisterRoutes () рдкрджреНрдзрддрд┐ рд╣реИ рдЬреЛ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреА рд╣реИред рдЕрдВрддрд┐рдо рд░реВрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдлреЛрд░рдЪ рдирд┐рд░реНрдорд╛рдг рдЬреЛрдбрд╝реЗрдВред

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); foreach (Route r in routes) { if (!(r.RouteHandler is SingleCultureMvcRouteHandler)) { r.RouteHandler = new MultiCultureMvcRouteHandler(); r.Url = "{culture}/" + r.Url; //Adding default culture if (r.Defaults == null) { r.Defaults = new RouteValueDictionary(); } r.Defaults.Add("culture", Culture.ru.ToString()); //Adding constraint for culture param if (r.Constraints == null) { r.Constraints = new RouteValueDictionary(); } r.Constraints.Add("culture", new CultureConstraint(Culture.en.ToString(), Culture.ru.ToString())); } } } 

рдорд╣рд╛рди, рдЪрд▓реЛ рдЗрд╕ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рдВрдЧрд▓рдХрд▓реНрдЪрд░рдореНрдпреВрд░реАрдЬ рд░реЙрдЙрдЯрд╣реИрдВрдбрд▓рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рд░реВрдЯ рдХреА рд░реВрдЯрд╣реИрдВрдбрд▓рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдорд▓реНрдЯреАрдХрд▓реНрдЪрд░ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ URL рдореЗрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрд╕реНрдХреГрддрд┐ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╕рдВрд╕реНрдХреГрддрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

 public class CultureConstraint : IRouteConstraint { private string[] _values; public CultureConstraint(params string[] values) { this._values = values; } public bool Match(HttpContextBase httpContext,Route route,string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { // Get the value called "parameterName" from the // RouteValueDictionary called "value" string value = values[parameterName].ToString(); // Return true is the list of allowed values contains // this value. return _values.Contains(value); } } 

рдФрд░ рд╕рдВрд╕реНрдХреГрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА

 public enum Culture { ru = 1, en = 2 } 

рд╕рд░рд▓ рдлрд╕рд▓ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рддрдВрддреНрд░

рд╕рдВрд╕реНрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЦрд╛рддрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реВрдВред

 public ActionResult ChangeCulture(Culture lang, string returnUrl) { if (returnUrl.Length >= 3) { returnUrl = returnUrl.Substring(3); } return Redirect("/" + lang.ToString() + returnUrl); } 

рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЖрдВрд╢рд┐рдХ рджреГрд╢реНрдп - CultureSwitchControl.ascx

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%= Html.ActionLink("eng", "ChangeCulture", "Account", new { lang = (int)MvcLocalization.Helpers.Culture.en, returnUrl = this.Request.RawUrl }, new { @class = "culture-link" })%> <%= Html.ActionLink("", "ChangeCulture", "Account", new { lang = (int)MvcLocalization.Helpers.Culture.ru, returnUrl = this.Request.RawUrl }, new { @class = "culture-link" })%> 

рд╕рдВрд╕реНрдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рд╕рдВрд╕реНрдХреГрддрд┐-рд╕реНрд╡рддрдВрддреНрд░ рдорд╛рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SingleCultureMvcRouteHandler рдХреЗ рд▓рд┐рдП рд░реВрдЯрд╣реИрдВрдбрд▓рд░ рдЧреБрдг рд╕реЗрдЯ рдХрд░реЗрдВ:

 routes.MapRoute( "AboutRoute", "About", new { controller = "Home", action = "About"} ).RouteHandler = new SingleCultureMvcRouteHandler(); 

рддреЛ, рдпрд╣ рд╕рдм рд╣реИ: рдмрд┐рдирд╛ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг, рдЖрдЙрдЯрдкреБрдЯрдХреИрдЪ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ (рдореЗрд░реА рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП) рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдбрд╝реА рд╣реИ (рдкрд░рд┐рдпреЛрдЬрдирд╛ VS2010 рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереА)

Source: https://habr.com/ru/post/In128156/


All Articles