,但是当我调用Url.Action(...)时,它不会生成本地化的URL。任何想法我做错了什么?文化正在改变页面,我能够确定用户选择了哪种语言,但Url.Action没有生成本地化的URL。这是自定义路由,它会更改路由表值(不确定是否采用这种标准方式):){base.Defaults=CreateRouteValueDictionary(defaults);base.Constraints=CreateRouteValueDictionary(contraints);}publicoverrideRouteDataGetRouteData(HttpContextBasehttpContext){varrouteData=base.GetRouteData(httpContext);if(routeData!=null){varculture=routeData.Values["culture"].ToString();varcookie=httpContext.Request.Cookies["文化"];varareEqual=false;if(cookie==null||cookie.Value==""||!(areEqual=string.Equals(culture,cookie.Value,StringComparison.OrdinalIgnoreCase))){routeData.Values["culture"]=culture;httpContext.Response.Cookies.Add(newHttpCookie("culture",culture));}elseif(!areEqual){routeData.Values["culture"]=cookie.Value;CultureHelper.SetCurrentCulture(文化);}返回路由数据;}私有静态路由ValueDictionaryCreateRouteValueDictionary(objectvalues){vardictionary=valuesasIDictionary;if(dictionary!=null){returnnewRouteValueDictionary(dictionary);}}else{returnnewRouteValueDictionary(values);}}}和这个帮助器类来设置线路程序文化:Thread.CurrentThread.CurrentCulture=信息;Thread.CurrentThread.CurrentUICulture=信息;}publicstaticstringGetCurrentCulture(boolignoreRouteData=false){if(!ignoreRouteData){varrouteData=HttpContext.Current.Request.RequestContext.RouteData;客体文化;如果(routeData.Values.TryGetValue("culture",outculture)){returnculture.ToString();}}varcookie=HttpContext.Current.Request.Cookies["文化"];if(cookie!=null&&cookie.Value!=null){返回cookie.Value;}返回GetThreadCulture();}publicstaticstringGetThreadCulture(){var文化=Thread.CurrentThread.CurrentCulture.Name;如果(culture.IndexOf('-')>-1){culture=culture.Substring(0,2);}返回文化;还有RouteConfig类,它派生自Global.asax调用并使用我的自定义路由类设置路由:axd/{*路径信息}");routes.Add("Partial",newCultureRoute("{culture}/{cotroller}/partial/{view}",new{culture="ka",controller="home",action="partial",view=""},new{culture="(ka|en)"}));routes.Add("Default",newCultureRoute("{culture}/{controller}/{action}/{id}",new{culture="ka",controller="home",action="index",id=UrlParameter.Optional},new{culture="(ka|en)"}));但是如果没有这个扩展方法,我无法生成基于文化的路由,也就是说,Url.Action不会根据自定义路由类创建的路由表生成URL:publicstaticstringAction2(thisUrlHelperhelper,stringaction){varculture=CultureHelper.GetThreadCulture();返回helper.Action(action,new{culture=culture});}要在ActionLink中构建URL,您还需要重写称为GetVirtualPath的反向查找方法。这是我如何执行此操作的示例(但我继承了RouteBase而不是Route,因此您的可能需要以不同的方式完成)。publicoverrideVirtualPathDataGetVirtualPath(RequestContextrequestContext,RouteValueDictionaryvalues){VirtualPathDataresult=null;如果(requestContext.RouteData.IsAreaMatch(this.area)){vartenant=this.appContext.CurrentTenant;//获取所有页面varpages=this.routeUrlPageListFactory.GetRouteUrlPageList(tenant.Id);IRouteUrlPageInfo页面=null;if(this.TryFindMatch(pages,values,outpage)){result=newVirtualPathData(this,page.VirtualPath);}}返回结果;}privateboolTryFindMatch(IEnumerablepages,RouteValueDictionaryvalues,outIRouteUrlPageInfopage){page=null;GuidcontentId=Guid.Empty;varaction=Convert.ToString(values["action"]);varcontroller=Convert.ToString(values["controller"]);varlocaleId=(int?)values["localeId"];如果(localeId==null){返回false;}if(Guid.TryParse(Convert.ToString(values["id"]),outcontentId)&&action=="Index"){page=pages.Where(x=>x.ContentId.Equals(contentId)&&x.ContentType.ToString().Equals(controller,StringComparison.InvariantCultureIgnoreCase)).Where(x=>x.LocaleId.Equals(localeId)).FirstOrDefault();如果(页面!=null){返回真;}}返回假;我发现由于我的几条路线需要本地化并且在内部我使用CultureInfo.LCID而不是文化字符串来识别文化,所以最好将文化解析代码放在Global.asax的Application_BeginRequest事件中,但是如果您只是在内部使用区域性字符串,可能没有必要。顺便说一句-我认为在您的情况下不需要使用cookie,因为文化可以直接从URL派生。这似乎是不必要的开销,尤其是当您考虑到每次请求(包括图像和javascript文件)都会传输cookie时。更不用说这样做的安全隐患——您至少应该加密cookie中的值。下面是如何正确清理cookie数据的示例。它实际上是导致不正确行为的其他原因。我有一个扩展方法,它生成一个动作来切换语言,并修改路由数据。publicstaticstringCultureRoute(thisUrlHelperhelper,stringculture="ka"){varvalues=helper.RequestContext.RouteData.Values;字符串actionName=values["action"].ToString();如果(values.ContainsKey("culture")){values["culture"]=culture;}else{values.Add("文化",文化);}returnhelper.Action(actionName,HttpContext.Current.Request.QueryString.ToRouteValues());我把它改成了这个,它起作用了:stringactionName=values["action"].ToString();返回helper.Action(actionName,new{culture=culture});我不需要重写GetVirtualPath方法来使其工作。我想大多数时候我们可以使用Route类,只是重写GetRouteData,但是想听听其他人的想法...以上就是C#学习教程的全部内容:MVC4:自定义路由和Html。大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
