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",
рдорд╣рд╛рди, рдЪрд▓реЛ рдЗрд╕ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣
рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░
рд╕рд┐рдВрдЧрд▓рдХрд▓реНрдЪрд░рдореНрдпреВрд░реАрдЬ рд░реЙрдЙрдЯрд╣реИрдВрдбрд▓рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рд░реВрдЯ рдХреА
рд░реВрдЯрд╣реИрдВрдбрд▓рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ
рдорд▓реНрдЯреАрдХрд▓реНрдЪрд░ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 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) {
рдФрд░ рд╕рдВрд╕реНрдХреГрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА
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 рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереА)