ルート/URLに追加の要素があるMVC4アプリケーションがあります。これは言語という名前です。
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または提供したオーバーライドされた関数のいずれかに何かを追加する必要があります。しかし、私は何をどのように行うのかわかりません。