Bagatele… Część 1

W dziś zainaugurowanym cyklu będe prezentował najczęściej krótkie pomysły/rady/rozwiązania nie nadające się raczej na osobne wpisy, a warte zachowania. Podczas pracy nad projektem pojawiają się czasem drobne problemy, które rozwiązujemy szybko (lub nie)… by za kilka dni próbować sobie to rozwiązanie przypomnieć :-) Niech to będzie więc taka podręczna pamięć rozszerzona.

ASP.NET MVC – komunikat po wykonaniu akcji

Chcielibyśmy czasem, aby po wykonaniu jakiejś akcji kontrolera – najczęściej modyfikującej dane – i po przekierowaniu do innej akcji/widoku, wyświetlił się komunikat. A w komunikacie np. potwierdzenie wykonania akcji (‚Zapisano nowy rekord’), albo podsumowanie (‚Usunięto 14 rekordów’). By to uzyskać możemy wykorzystamy dwa elementy ASP.NET Mvc: widoki częściowe (partial views) i słownik TempData.

Czym jest słownik TempData? To kontener na dane pozwalający je przekazywać między kontrolerem a widokiem. Tym jednak różni się od np. ViewData czy ViewBag, że jest zachowywany dla następnego żądania HTTP. Jeśli więc po wykonaniu akcji przekierowujemy się do innej za pomocą metody RedirectToAction – dane z TempData pozostaną dostępne. Wystarczy więc w akcji, po której chcielibyśmy wyświetlić wiadomość zapisać ją do TempData:

[HttpPost]
public ActionResult Create(FormCollection collection)
{
    TempData["Message"] = "Dodano rekord";
    return RedirectToAction("Index");
}

a będzie ona dostępna dla akcji Index (po jej wywołaniu wiadomość ulegnie autodestrukcji! :-) ).

Widok częściowy możemy natomiast zobaczyć już po utworzeniu nowego projektu. W domyślnym szablonie layoutu aplikacji (plik _Layout.cshtml w katalogu Views/Shared) znajdziemy linię:

@Html.Partial("_LoginPartial")

która powoduje włączenie do widoku pliku _LoginPartial.cshtml zawierającego dane dotyczące logowania. Postąpimy w ten sam sposób i dołączymy widok częściowy, który będzie wyświetlał wiadomość dla użytkownika. Dodajemy więc prosty plik _TempMessage.cshtml:

@{
    string messageString = TempData["Message"] as string;
    if (!String.IsNullOrEmpty(messageString))
    {
        <p>@messageString</p>
    }
    else
    {
        <p>Brak wiadomości</p>
    }
}

i wklejamy linię

@Html.Partial("_TempMessage")

w wybrane miejsce szablonu _Layout.cshtml. Jeśli wiadomości chcemy wyświetlać tylko w wybranych miejscach aplikacji widok _TempMessage dodajemy w wybranych widokach.

I to wszystko, co jest potrzebne by móc wyświetlać wiadomości po przekierowaniu do innej akcji.

Visual Studio 2013 – bardzo, bardzo, BARDZO wolne działanie

Problem pojawił się znienacka. Napsuł jednak krwi na tyle, że zasłużył sobie na miejsce… no, przynajmniej w tym cyklu :-)

Któregoś dnia, nagle i po prostu, włączenie Visual Studio nie zakończyło się ukazaniem pulpitu roboczego, a dramatycznym i graniczącym z zawieszeniem spowolnieniem działania kompa połączonym z jednostajnym rzeźbieniem twardym dyskiem. Jakakolwiek praca była niemożliwa, a Visual Studio dało się zamknąć jedynie ubijając proces devenv.exe. Po ubiciu dysk się uspokajał i działanie komputera wracało do normy. Ki czort?! Włączamy VS ponownie: i znów dysk wskakuje na najwyższe obroty, a ja nie mogę pracować.

Rzecz robiła się poważna, a jak na złość dogłębny googiel nie dawał odpowiedzi: fraza „slow visual studio” jest chyba zbyt popularna :-) Reinstalacja Visual Studio również nie pomogła…

No i co do diabła wyrabia ten dysk? Odpowiedź przyniosła ciężka artyleria – Process Monitor z pakietu narzędzi Sysinternals. Okazało się, że po uruchomieniu Visual Studio przeszukuje podkatalogi w katalogu użytkownika, głównie repozytoria kodu. I robi to w kółko! Raz za razem, te same katalogi, odczyt, odczyt podkatalogów i rekursywnie wgłąb…

To już był punkt zaczepienia. Po przeguglaniu następnej setki stron natrafiłem w końcu na opis podobnego problemu. No i co najważniejsze, na rozwiązanie. Przyczyna, jak się okazało, tkwiła w pluginie Microsoft Git Provider, który zbiesił się i oszalał.

Rozwiązanie: wyłączyć Microsoft Git Provider w Tools -> Options -> Source control ustawiając  ‚Current source control plug-in’ na ‚None’ lub instalując choćby dodatek ‚Git Source Control Provider’ i jego ustawiając jako bieżący plugin systemu kontroli wersji. Jeśli to nie pomoże, spróbujcie porad zawartych tu: https://blog.rendle.io/disable-the-git-source-control-add-in-in-vs2013-permanently – trochę bardziej hardkorowe :-)

 

Marcin

Dodaj komentarz