1

ルート/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または提供したオーバーライドされた関数のいずれかに何かを追加する必要があります。しかし、私は何をどのように行うのかわかりません。

4

1 に答える 1

0

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);
    }

これで、間違った言語を入力すると、正しい言語のページにリダイレクトされます。2つの間違ったパラメーターを指定すると、404(論理的)にリダイレクトされます。

于 2013-02-03T20:50:21.297 に答える