środa, 19 lutego 2014

SiteMap + KendoUI + MVC + WebForms + lokalizacje = problemy

W ostatnich dniach stanąłem przed zadaniem wdrożenia do istniejącej aplikacji w WebForms, ASP.NET MVC dla nowych funkcjonalności. Oprócz MVC, wykorzystuję Kendo UI. Wdrożenie nowych podstron wymagało niestety przepisania dwóch kontrolek - o ile formatka do wyświetlania informacji o błędach okazała się pikusiem, o tyle menu, zależne od zestawu ról użytkownika, zlokalizowane (możliwość obsługi wielu języków) nie jest już taka trywialna. Oczywiście można skopiować sitemap i przepisać ją do wykorzystania MvcSiteMap Provider. Tylko po co mnożyć byty? To się przecież MUSI dać zrobić. Opinie znalezione z Google mówią, że się nie da. Przynajmniej nie "out of the box" z kontrolką KendoUI Menu. No dobra. Nie dają defaultowo wsparcia, ale może jednak jakoś się da... Odczyt pliku zawierającego sitemap jest dość dobrze opisany (np. tu).

Podstawa odczytu to poniższy fragment kodu:
if(!SiteMapManager.SiteMaps.ContainsKey("WebSiteMap"))
{
SiteMapManager.SiteMaps.Register("WebSiteMap", sitemap => sitemap.LoadFrom("~/Web.sitemap"));
}

To co zrobiliśmy właśnie to załadowanie do statycznego obiektu naszej sitemapy. Różnica pomiędzy tą zaimplementowaną przez KendoUI i .NET polega na tym, że Kendo nie jest wstanie automatycznie przetłumaczyć wpisów z pliku .resx podpiętych do taga resourceKey. Ponadto brakuje ról a adresy do stron ASPX mają \ zamiast /. Niestety właściwości title, po odczycie, będą null'ami. Bez tego, mimo sukcesu przy odczycie, nie uda się ustawić nazw pozycji. Konieczne jest przeiterowanie kolekcji node'ów i odczyt z atrybutów resourceKey.

Problematyczne okazało się ucinanie wierszy w przypadku, gdy użytkownik nie ma danej roli. Usuwanie node'a nie dawało sukcesu. Dopiero ustawienie Visibility = false, gdy właściwość Text jest null'em z poziomu cshtml'a dało pożądany rezultat.

3 dni walki, ale rezultat jest satysfakcjonujący.

Brak komentarzy:

Prześlij komentarz