C# 检查url是否使用语言正确构造
我有一个MVC4应用程序,在route/url中有一个额外的元素,名为language:C# 检查url是否使用语言正确构造,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个MVC4应用程序,在route/url中有一个额外的元素,名为language: routes.MapRoute( name: "languageDefault", url: "{language}/{controller}/{action}/{id}", defaults: new { language = "en-US", controller = "Home", action = "Index",
routes.MapRoute(
name: "languageDefault",
url: "{language}/{controller}/{action}/{id}",
defaults: new {
language = "en-US",
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
现在,每次执行操作时,我都会使用自定义filterAttribute检查语言设置是否正确:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string cultureName = null;
var request = filterContext.HttpContext.Request;
string currentUrl = request.RawUrl;
string[] splittedStrings = currentUrl.Split('/');
string currentLanguage = CultureHelper.CheckCulture();
var cultureCookie = request.Cookies["_culture"];
var possibleCultures = UnitOfWork.CulturesRepository.GetListOfCultureNames();
foreach (string culture in possibleCultures)
{
if (splittedStrings[1] == culture) cultureName = splittedStrings[1];
}
if (cultureCookie != null) cultureName = cultureCookie.Value;
if (currentLanguage != null) cultureName = currentLanguage;
if (cultureName != null)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
else
{
cultureName = possibleCultures[0];
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
base.OnActionExecuting(filterContext);
}
我现在的问题是,当我检查是否存在一种语言,如果没有,设置一种时,如果所提供的语言不正确,我不会做任何事情。例如
当用户键入:
http://www.example.com/en-US/shop
他提供了一个正确的url,因此可以正确地看到商店页面。但是,如果他没有提供这样的语言:
http://www.example.com/shop
语言检查已经完成,根据这是否是他的第一次访问,他的语言已经设置好。问题是url不会更改
我想更改url,以便它显示用户查看页面时使用的语言。换句话说,当你试图访问
http://www.example.com/shop
应将其重定向至:
http://www.example.com/en-US/shop
无论访问者访问哪个页面,都需要这样做。换句话说,我可能需要在global.asax或我提供的重写函数中添加一些内容。
但我不知道是什么和如何解决的。我通过改变OnActionExecuting方法解决了这个问题:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
string currentUrl = request.RawUrl;
var urlHelper = new UrlHelper(request.RequestContext);
string baseurl = urlHelper.Content("~");
string currentLanguageFromUrl = currentUrl.Split('/')[1];
string currentLanguageFromCulture = CultureHelper.CheckCulture();
var currentLanguageFromCookie = request.Cookies["_culture"];
var possibleCultures = UnitOfWork.CulturesRepository.GetListOfCultureNames();
if (possibleCultures.All(culture => currentLanguageFromUrl != culture))
{
string cultureName;
string newUrl;
if (currentLanguageFromCookie != null)
{
cultureName = currentLanguageFromCookie.Value;
CultureHelper.SetCulture(cultureName);
newUrl = baseurl + cultureName;
filterContext.Result = new RedirectResult(newUrl);
return;
}
if (currentLanguageFromCulture != null)
{
cultureName = currentLanguageFromCulture;
CultureHelper.SetCulture(cultureName);
newUrl = baseurl + cultureName;
filterContext.Result = new RedirectResult(newUrl);
return;
}
cultureName = possibleCultures[0];
CultureHelper.SetCulture(cultureName);
newUrl = baseurl + cultureName;
filterContext.Result = new RedirectResult(newUrl);
return;
}
base.OnActionExecuting(filterContext);
}
现在,当您填写不正确的语言时,您将被重定向到具有正确语言的页面,如果您提供了两个不正确的参数,您将被重定向到404(这是合乎逻辑的)。这听起来有点像黑客,但如果未设置语言,您可以尝试重定向到正确的URL……那么我应该将重定向放在哪里?我需要在每次访问者访问我网站的页面时检查它。