[HomeWallet] Ważne szczegóły

W tym tygodniu miałem mniej czasu na pochylenie się nad HomeWallet, z powodu aplikacji o której wspominam tutaj, ale coś tam udało się zrobić 🙂 W większości były to poprawki kodu oraz trochę małych, ale ważnych szczegółów. Zaczynajmy.


Chosen

Pierwszą rzeczą jaką zrobiłem tuż po tym, jak poprawiłem zgodnie z zaleceniem z komentarzy kod kontrolerów, było dołączenie do projektu Chosen. Chosen to plugin jQuery, który ulepsza selecty: pozwala na wyszukiwanie pośród opcji, zmianę wyglądu multi selectów czy dynamiczne dodawanie opcji. Te ostatnie szczególnie się przyda przy np. dodawaniu sklepów podczas tworzenia paragonów. Instalacja Chosen jest banalnie prosta. Wystarczy pobrać pliki js, css oraz ikonki w png i dołączyć do naszego projektu. W miejscu, gdzie chcemy użyć nowych selectów, dodajemy kod jQuery który włącza plugin, np.

$(".chosen-select").chosen()

Możemy, ponieważ Chosen to plugin jQuery, włączać plugin do konkretnych selectów używając klas czy też id. Po więcej informacji co do możliwości Chosen odsyłam do ich strony: https://harvesthq.github.io/chosen/

Przy okazji pracy z Chosen zauważyłem dosyć dziwne i nadal przeze mnie nie do końca zrozumiałe zachowanie Partial View. Otóż aby w Partial View włączyć Chosen, należy kod inicjalizujący dodać do pliku html właśnie Partial View. Jednak już odczyt stanu checkboxa należy przechwytywać w głównym widoku z którego wywołujemy dialog. Działa to dosyć dziwnie i nadal będę z tym walczył.


Culture

Kolejnym problemem okazało się wysyłanie do kontrolera przez AJAX liczb z wartościami dziesiętnymi. AJAX automatycznie zmienia przecinek na kropkę, co jest na tyle fajne, że zawsze jest jedna forma. USA oczywiście musi mieć wszystko inaczej i to właśnie kropka jest separatorem liczb dziesiętnych a nie przecinek jak jest to w naszym kraju. Przekazując więc wartość z kropką kompilator nie jest w stanie przypisać jej do zmiennej typu double, bo uważa to za błędny znak. Doszedłem do wniosku, że nie ma co z tym walczyć, tylko należy zmienić lokalizację całej aplikacji. Spowoduje to prawdopodobnie nieco więcej walki z datami, ale z nimi i tak jest wiecznie problem, o czym zresztą nieco później.

Aby zmienić lokalizację w aplikacji .NET Core należy dodać do naszego projektu paczkę Microsoft.AspNetCore.Localization która jest dostępna poprzez NuGet. Następnie w Startup.cs w metodzie ConfigureServices dodajemy następujący kod:

services.AddLocalization(options => options.ResourcesPath = "GlobalResources");
services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("en")
    };
   options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
   options.SupportedCultures = supportedCultures;
   options.SupportedUICultures = supportedCultures;
});

Gdzie w tablicy supportedCultures dodajemy wszystkie “culture” jakie nasza aplikacja jest w stanie obsługiwać, a w options.DefaultRequestCulture wybieramy domyślną.

Następnie w metodzie Configure dodajemy jeszcze dwie linie kodu:

var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();

app.UseRequestLocalization(locOptions.Value);

Rozwiązuje to problem z kropką, gdyż teraz to ona jest domyślnym separatorem.


Input type date

Jak wspominałem, z datami jest wiecznie problem. Przy tworzeniu paragonu chcę, aby data zakupu była automatycznie ustawiona na aktualny dzień lub wybraną datę. W .NET Core nie powinno się już używać helperów w Razor, zamiast tego mamy atrybuty. Przykładowo zamiast użyć

@Html.EditorFor(model=>model.Date)

używamy np.

<select asp-for=”Date”/>

Jak dla mnie pomysł bardzo dobry, dzięki temu HTML staje się łatwiejszy do czytania. 

“Select” posiada swoje typy. Jednym z nich jest “date”. C# nie posiada jednak klasy Date, a jedynie DateTime. Co prawda można użyć typu “datetime”, jednak wypisuje on datę oraz czas, jak sama nazwa wskazuje. Moim celem jest wyświetlanie jedynie daty.

Chcąc więc przypisać na start do selecta datę, należy ustawić typ na “date” ORAZ przy ustawianiu źródła, wykorzystać metodę Date() klasy DateTime. Należy to zrobić już w Razor, zrobienie tego np. w kontrolerze nic nie da. Zatem kod html powinien wyglądać np. tak:

<input type="date" asp-for="Date.Date" class="form-control" placeholder="Date" />

Lazy Loading w EF Core

Ostatnią rzeczą jaką chcę się podzielić, jest Lazy Loading w Entity Framework Core. A raczej jego brak. Niestety, EFCore nadal nie wspiera LL. Na GitHub’ie potwierdzono, że w wersji 2.0 również się on nie znajdzie. Cóż, trzeba radzić sobie bez i np. pamiętać, żeby dodawać wszędzie gdzie trzeba Include 🙂 Złapałem się na tym przy zapisywaniu paragonu do bazy. Co my byśmy zrobili bez debuggera? 😉


Na ten tydzień to tyle, w następnym prawdopodobnie również nie będzie zbyt dużo kodu. Powoli jednak wszystko idzie do przodu 🙂 Dzięki za odwiedziny i zapraszam do dyskusji w komentarzach.

Do zobaczenia, cześć!

Dodaj komentarz