Od jakiegoś czasu pracuję nad aplikacjami webowymi tworzonymi w ASP .NET. Platforma ta posiada taki “fajny” feature, który generuje wyjątki w języku strony: UICulture language. Chodzi o wyjątki generowane przez maszynę wirtualną czyli wiadomości dla NullPointerException to
“Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”
a NotImplementedException ma Message:
“Metoda lub operacja nie jest zaimplementowana.”
Widząc taki komunikat każdy średnio zaawansowany programista poradzi sobie bez wujka G. Ale gdy treść komunikatu brzmi:
“Istniejący obiekt w obiekcie ObjectContext jest w stanie Added. Zmiany można zastosować tylko wtedy, gdy istniejący obiekt jest w stanie niezmieniony lub zmodyfikowany.”
sytuacja nieco się komplikuje.
Dlatego właśnie ten piękny w swojej idei pomysł M$ jest strasznie głupi i zamiast ułatwiać, komplikuje życie. Jeden argument opisałem wyżej: EnglishNETCommunity.size() > PolishNETCommunity.size(). Dodatkowo każda dobrze napisana aplikacja nigdy nie wyświetli użytkownikowi komunikatu wygenerowanego przez maszynę wirtualną - opisy są tylko dla programisty. Zaprezentowany powyżej komunikat sugeruje istnienie trzech stanów dla obiektu: Added, zmieniony, niezmieniony. BRAWO
Ponarzekałem - i od razu lepiej. A teraz jak sobie poradzić z takim stanem rzeczy. Najlepiej ustawić sobie w projekcie UICulture oraz Culture na “auto”. A robi się to w ten prosty, oczywisty i banalny sposób: Należy wyedtować plik: Web.config UWAGA chodzi o plik znajdujący się w głównym katalogu projektu(w projektach MVC są 2 pliki Web.config :O WTF?). W głównym elemencie “configuration” odszukujemy node: “system.web” i dodajemy nowy child-node globalization o następującej treści:
<globalization uiCulture="auto" culture="auto" />
Dzięki takiemu ustawieniu zmianę Culture będziemy dokonywać w ustawieniach przeglądarki w preferowanym języku. Aby ustawić na sztywno kulturę trzeba zamiast auto wpisać en-US(lub inną szczegółową lokalizację), podanie samego en skutkuje wyrzuceniem wyjątku - oczywiście w języku polskim. Można także włączyć globalizację tylko dla jednej strony. W takim wypadku należy dodać w nagłówku strony ASP tag:
<%@ Page UICulture="en-US" Culture="en-US" %>
Aby ustawić globalizację programowo można zastosować poniższe polecenie:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
Jak widać zmiana dotyczy wątku a nie aplikacji także nie można sobie tego wpisać gdzie popadnie
A mój wyjątek brzmi teraz tak:
The existing object in the ObjectContext is in the Added state. Changes can only be applied when the existing object is in an unchanged or modified state.
I wszystko jasne - trzeba było tak od razu
Edit: widzę że jest tu kilku gości od wujka G. Roziazanie problemu opisałem na stackoverflow

Ostatnie komentarze