2016-06-30 7 views
0

Disclaimer: Ich bin immer noch ein Anfänger, und ich behalte ein großes Projekt von jemand anderem mit wenig Dokumentation. Ich könnte also etwas Offensichtliches vermissen.Breadcrumb nicht auf Kulturwechsel

Hier geht: Meine Web-Anwendung kann durch 2 DNS-Namen zugegriffen werden, "www.website.com" und "www.siteweb.com" eine in Englisch und die andere in Französisch.

Früher gab es eine zweisprachige Splash-Seite, die zur Sprache auffordert, aber da wir 2 URLs haben, musste ich die Splash-Seite löschen und automatisch auf die Hauptseite in der Sprache umleiten, die der URL entspricht darauf zuzugreifen.

Hier ist die Umleitung Code auf dem nicht mehr existierenden Splash-Seite befindet (index.vbhtml):

@Code 
If Request.ServerVariables("SERVER_NAME").Contains(ConfigurationManager.AppSettings("SiteDNSnameEN")) Then 
    Response.Redirect(Url.Action("SetLanguage", Resources.ResourceURL.CONTROLLER_LANGUAGE, New With {.pCulture = "en-CA", .pReturnURL = "/Home"})) 
ElseIf Request.ServerVariables("SERVER_NAME").Contains(ConfigurationManager.AppSettings("SiteDNSnameFR")) Then 
    Response.Redirect(Url.Action("SetLanguage", Resources.ResourceURL.CONTROLLER_LANGUAGE, New With {.pCulture = "fr-CA", .pReturnURL = "/Accueil"})) 
End If 
@EndCode 

Wenn auf der Französisch Seite „Home“, die Semmelbrösel funktioniert gut, wenn ich die Sprache Toggle-Button verwenden, die bezieht sich auf einen Controller, der die URL übersetzt und "SetLanguage" auslöst, die im Wesentlichen CurrentCulture und CurrentUICulture setzt und die pReturnURL erneut lädt. Alles wird richtig übersetzt und es gibt kein Problem.

Aber wenn ich die englische URL benutze (oder gefälscht benutze sie, weil in dev es nur localhost ist), wird der Breadcrumb angezeigt, aber wenn ich auf die Sprachumschalttaste drücke, wird der Breadcrumb nicht angezeigt. Meine beste Vermutung ist, dass MVCSiteMapProvider immer noch nach den englischen Ressourcen sucht, da der Breadcrumb auf der einen Seite angezeigt wird, die zufällig denselben Pfad auf Französisch oder Englisch hat.

Ich habe mit globac.asax Routen und mit der Umleitung gespielt, aber ich nur erreichen, um eine Sprache zu beheben und die andere zu schrauben.

Ich bin mir sicher, dass es nur eine kleine Lösung gibt, die mich schon seit einiger Zeit entzieht. Irgendwo entlang der Linie scheint der Kulturwandel nicht zu funktionieren. Ich habe die Aktion "SetLanguage" behandelt und es zeigt immer die erwartete Kultur. Das könnte nicht sein, aber ich denke MVCSiteMapProvider folgt nicht immer aus irgendeinem Grund.

Hier ist der Teil von Global.asax, die ich mit gebastelt habe:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
    routes.MapRoute(_ 
     "Splash", _ 
     "", _ 
     New With {.controller = "Root", .action = "Index"} _ 
    ) 

    routes.MapTranslatedRoute(_ 
     "TranslatedRoute", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = "Home", .action = "Index", .id = ""}, _ 
     New With {.controller = translationProvider, .action = translationProvider}, _ 
     False _ 
    ) 

    Dim controllerHomeEN = Resources.ResourceURL.ResourceManager.GetString("CONTROLLER_HOME", New CultureInfo(WebHelper.CONST_CURRENT_CULTURE_EN)) 
    Dim actionIndexEN = Resources.ResourceURL.ResourceManager.GetString("ACTION_INDEX", New CultureInfo(WebHelper.CONST_CURRENT_CULTURE_EN)) 


    routes.MapRoute(_ 
     "Default", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = controllerHomeEN, .action = actionIndexEN, .id = UrlParameter.Optional} _ 
    ) 

Antwort

0

Normalerweise, wenn die Brotkrümel es verschwindet bedeutet, dass Sie nicht in der Knoten für alle Wunsch des Streckenwerte entfallen. Wenn beispielsweise ein Routenwert "Kultur" von der Route übergeben wird und Sie ihn nicht in preservedRouteParameters eingerichtet haben, stimmt der Knoten nicht mit der Anforderung überein.

Die beste Vermutung ist, dass Sie etwas mit Ihrem translationProvider tun, das verursacht, dass der Knoten nicht übereinstimmt. Aber da du den Code nicht gepostet hast, kann ich mir nur was vorstellen.

Beachten Sie, dass wenn Sie schreiben die SiteMapNode.Title Eigenschaft irgendwo, die Sie nicht sein sollten, könnte der Wert zu anderen Anforderungen bluten. MvcSiteMapProvider v3.x war nicht threadsafe. Wenn also eine Anforderung einen Wert in den zwischengespeicherten Knoten der SiteMap aktualisiert hatte, waren sie in allen anderen Anforderungen sichtbar, bis der Cache abläuft (oder bis die nächste Anforderung ihn überschrieb).

Beachten Sie, dass dynamische Knotenanbieter nicht dynamisch pro Anforderung aufgerufen werden. Sie dienen zum Erstellen von zwischengespeicherten (gemeinsamen) Knoten, die auf dynamischen Daten basieren.Daher sollten Sie keine pro-Request-Bedingungen (z. B. Lokalisierung) innerhalb eines dynamischen Knoten-Providers setzen.

Das Dokument How to Localize Site-Map Data auf MSDN zeigt die korrekte Konfiguration der Lokalisierung in MvcSiteMapProvider v3.x. Beachten Sie, dass es innerhalb von MVC eine issue with deployment globale Ressourcen gibt, wenn Sie die Standardeinstellungen für das Erstellen von Dateien verwenden.

Siehe auch:

Für MvcSiteMapProvider v4.x, you have other options, wenn Sie zu 01.231.173 waren. Auch MvcSiteMapProvider v4.x ist threadsafe - wenn Sie einen Wert wie Titel innerhalb der Anfrage aktualisieren, wird es nur für die aktuelle Anfrage gelten und kein anderer Benutzer wird es sehen.

+0

Aktualisierung auf v4 mein Problem behoben. Ich hatte Probleme, es vorher zu installieren und rollte normalerweise zurück, weil ich nicht war, wenn das es beheben würde. Vielen Dank! – Mortar9

Verwandte Themen