Asp.net 设置Sitecore.Context.Language会给我一次错误语言的项目

Asp.net 设置Sitecore.Context.Language会给我一次错误语言的项目,asp.net,facebook,sitecore,sitecore7,Asp.net,Facebook,Sitecore,Sitecore7,我的Sitecore网站中有此页面项,可从Facebook页面选项卡查看。这是一个相当简单的页面,但我有一个问题,Sitecore在第一次加载时给了我错误的语言,然后后续加载就可以了 此项通过此控制器运行: // // GET: /Portfolio/ public override ActionResult Index() { var appId = "*****"; var appSecret = "*****";

我的Sitecore网站中有此页面项,可从Facebook页面选项卡查看。这是一个相当简单的页面,但我有一个问题,Sitecore在第一次加载时给了我错误的语言,然后后续加载就可以了

此项通过此控制器运行:

    //
    // GET: /Portfolio/
    public override ActionResult Index()
    {

        var appId = "*****";
        var appSecret = "*****";

        // Defaults to en
        var requestLanguage = "en";

        // Get language from FB
        if (Request.Form["signed_request"] != null)
        {

            if (Request.Url.Host.ToLower().Contains("local")) {
                appId = "*****";
                appSecret = "*****";
            }

            var fbUser = new Facebook.FacebookClient
            {
                AppId = appId,
                AppSecret = appSecret
            };

            var parsedSignedRequest = JObject.Parse(fbUser.ParseSignedRequest(Request.Form["signed_request"]).ToString());
            if (parsedSignedRequest != null)
            {
                requestLanguage = parsedSignedRequest["user"]["locale"].ToString().StartsWith("fr") ? "fr-CA" : "en";
            } // Else: Request can't be parsed, something is wrong

        } // Else: Probably not in FB

        // ?l=***** can bypass language setting
        if (!string.IsNullOrWhiteSpace(Request.QueryString["l"]))
        {
            requestLanguage = Request.QueryString["l"];
        }

        Context.Language = Language.Parse(requestLanguage);

        // Views will need this
        ViewBag.requestLanguage = requestLanguage;
        ViewBag.appId = appId;

        return base.Index();

    }
当我调试这个时,它工作得非常好。我正在设置Sitecore的上下文。Facebook用户使用的语言我有法语和英语内容

现在,在视图上,我有一个主布局,它基本上除了无聊的html标记之外,还放置了占位符:

@Html.Sitecore().Placeholder("fb-body")
最后,我的视图渲染如下所示:

@using Sitecore.Globalization
@using Sitecore.Data.Items
@model RenderingModel

@{

    // I checked this and the context language here is always correctly set, even on first load (controller did that)
    // Sitecore.Context.Language = Language.Parse(ViewBag.requestLanguage);

    var all = "All";
    var back = "Back";
    var projetTitle = "the project";
    var servicesTitle = "services";

    // Since my language is correctly set, this works fine
    if (Language.Current.Name.ToLowerInvariant().Contains("fr"))
    {
        all = "Tous les projets";
        back = "Retour";
        projetTitle = "le projet";
        servicesTitle = "services";
    }

    var portfolio = Model.Item.Parent.Children.FirstOrDefault(x => x.TemplateName == "Portfolio");

    var wrongLanguage = portfolio.Language;
    var wrongLanguage2 = Model.Item.Language;

}
在这里,当我拉我的公文包节点时,它使用了错误的语言。如果我查看Model.Item.Language,也会得到错误的语言

我在这里遗漏了什么,我还需要告诉Sitecore什么,以便他理解我的语言吗?这看起来也有点像缓存问题。。。我应该在哪里解决这个问题


谢谢

我不确定您设置了什么基本控制器,但您似乎通过自己返回或从SitecoreController继承来使用PageContext.Current.PageView。我在尝试重现问题时遇到了一些问题,因此我最终得出以下结论:

public class TestController : Controller
{
    public ActionResult Index()
    {
        Sitecore.Context.SetLanguage(Language.Parse("nl-NL"), true);

        var view = (PageContext.Current.PageView) as RenderingView;
        var renderer = view.Rendering.Renderer as ViewRenderer;
        renderer.ViewPath = "/Views/Test/Index.cshtml";

        return View(view);
    }
}
在我看来,我认为:

@model Sitecore.Mvc.Presentation.RenderingModel

Context language is: @Sitecore.Context.Language<br/>
Model language is: @Model.Item.Language
第一次结果: 上下文语言为:nl nl 模型语言为:en

第二次结果: 上下文语言为:nl nl 模型语言为:nl nl

问题是语言解析器首先将语言设置为默认值“en”,当它进入控制器操作时,它已经获取了带有“en”的项。所以你的语言调整来得太晚了。第二次加载时使用正确的语言,因为调整后的语言保存在cookie中


设置语言的合适位置应该是LanguageSolver。您可以重写/扩展LanguageSolver,并在httpRequestBegin管道中替换它。这样,您还可以防止使用cachekey中的默认语言缓存本地化内容。

我不确定您设置了什么基本控制器,但您似乎通过自己返回或从SitecoreController继承来使用PageContext.Current.PageView。我在尝试重现问题时遇到了一些问题,因此我最终得出以下结论:

public class TestController : Controller
{
    public ActionResult Index()
    {
        Sitecore.Context.SetLanguage(Language.Parse("nl-NL"), true);

        var view = (PageContext.Current.PageView) as RenderingView;
        var renderer = view.Rendering.Renderer as ViewRenderer;
        renderer.ViewPath = "/Views/Test/Index.cshtml";

        return View(view);
    }
}
在我看来,我认为:

@model Sitecore.Mvc.Presentation.RenderingModel

Context language is: @Sitecore.Context.Language<br/>
Model language is: @Model.Item.Language
第一次结果: 上下文语言为:nl nl 模型语言为:en

第二次结果: 上下文语言为:nl nl 模型语言为:nl nl

问题是语言解析器首先将语言设置为默认值“en”,当它进入控制器操作时,它已经获取了带有“en”的项。所以你的语言调整来得太晚了。第二次加载时使用正确的语言,因为调整后的语言保存在cookie中

设置语言的合适位置应该是LanguageSolver。您可以重写/扩展LanguageSolver,并在httpRequestBegin管道中替换它。这样,您还可以防止使用cachekey中的默认语言缓存本地化内容