Thomas Bandt

Über mich | Kontakt | Archiv

[ASP.NET 2.0] Mehrere Web.sitemap Versionen anlegen

Folgender Fall:

Im vorherigen Posting habe ich geschildert, wie man die Mehrsprachigkeit erschlagen kann. Zu dem Zeitpunkt hatte ich auch noch blauäugig folgenden Satz bezüglich der Lokalisierung der URL aus den QuickStart-Tutorials im Hinterkopf:

"The URL, Title, and Description attributes on a   element can all be localized."

Das ist aber definitiv nicht der Fall. Es geht schlicht nicht. Also muss eine Alternative her. Wenn man nun die Texte und die URLs nicht in Resource-Files auslagern kann, kann man gleich darauf verzichten und mehrere Sprachversionen anlegen. Soweit so gut, und auch noch bequem.

Nun aber der nächste Knackpunkt: wenn ich die URL ~/de/Default.aspx, die es auf dem Filesystem ja nicht gibt, in die Web.sitemap schreibe, funktioniert das "SecurityTrimming" nicht mehr. Wie auch, er findet die Datei ja nicht. Da auf Rollen verzichtet wird, ist der Fall schnell klar: es müssen mindestens 4 Web.sitemap-Files angelegt werden. Für jede Sprache 2 Stück: eine für den eingeloggten und eine für den nicht angemeldeten User, das Ganze erstmal Deutsch/Englisch.

Nachdem man die 4 Files angelegt hat, muss man sie quasi als Fake-Provider in der Web.config registrieren, damit sie auch via SiteMapDatasource angesprochen werden können:

"SiteMap.DE.Default" enabled="true">
   
      "SiteMap.DE.Default" 
      type="System.Web.XmlSiteMapProvider" 
         siteMapFile="~/Library/Sitemap/Web.sitemap"
      />
      "SiteMap.DE.LoggedIn" 
         type="System.Web.XmlSiteMapProvider" 
         siteMapFile="~/Library/Sitemap/Web.loggedin.sitemap"
      />
      "SiteMap.EN.Default" 
         type="System.Web.XmlSiteMapProvider" 
         siteMapFile="~/Library/Sitemap/Web.en.sitemap"
      />
      "SiteMap.EN.LoggedIn" 
         type="System.Web.XmlSiteMapProvider" 
         siteMapFile="~/Library/Sitemap/Web.loggedin.en.sitemap"
      />
   

Anschließend muss man je nach Status (also Sprachversion + Info ob eingeloggt) den entsprechenden "Provider" dem SiteMapDatasource-Objekt zuweisen:

protected void Page_Load(object sender, EventArgs e)
{
   string siteMapProvider = string.Format("SiteMap.{0}."
      Request.QueryString["Language"].ToUpper());

   if (User.Identity.IsAuthenticated)
      siteMapProvider += "LoggedIn";
   else
      siteMapProvider += "Default";

   SiteMapDataSource1.SiteMapProvider = siteMapProvider;
}

Im wahren Leben sollte man natürlich tunlichst darauf verzichten sowas direkt über Request.Querystring zu machen - das nur zur Veranschaulichung ;-)

Was man nun hat, ist eine relativ pflegeleichte Variante, die nur 7 Zeilen Code erfordert, und einen um einen kompletten eigenen SiteMapProvider herum bringt, welcher ja schon gehört Arbeit bedeuten würde. Natürlich sind die Möglichkeiten sehr begrenzt (Rollen), aber in einem so abgesteckten Feld mit diesen Aufgaben ist das durchaus praktikabel und schnell realisierbar.



« Zurück  |  Weiter »