Quick tip: 12. Stosuj AsNoTracking() gdzie się da!

Dzisiaj krótko o tym, jak poprawić wydajność pobierania danych z wykorzystaniem Entity Framework.

Entity Framework ma wbudowany mechanizm śledzenia zmian na obiektach. Dzięki niemu Entity Framework wie, który obiekt jest nowy i że trzeba go dodać do bazy, co można zaktualizować, jakie referencje usunąć, zmienić, itp. Ficzer niby fajny, ale często przeszkadza – szczególnie, jeżeli dane chcemy jedynie pobrać i wiemy, że nie będziemy ich modyfikować. czytaj dalej

Quick tip: 10. console.log(); w IE

Niedawno w jednym z postów opisałem, jak można wykorzystać obiekt console do ułatwienia pracy z JavaScriptem. Wspomniałem tam, że obiekt ten nie jest standardowym obiektem JavaScript, a jest “dodawany” przez różne przeglądarki (lub dodatki do przeglądarek). W związku z tym może się zdarzyć, że nasza strona nie będzie działała na jakiejś przeglądarce. czytaj dalej

Quick tip: 09. jak "ukryć" metody publiczne w kontrolerze w ASP.NET MVC

W ASP.NET MVC domyślnie wszystkie metody publiczne zdefiniowane w klasie kontrolera są tzw. “action methods“, czyli możemy je wykonać podając odpowiedni adres url.

Czasami jednak chcielibyśmy, aby jakaś metoda była trochę bardziej ukryta przed światem. W ASP.NET MVC możemy tego dokonać dekorując daną metodę … czytaj dalej

Quick Tip: 08. ctrl+C, ctrl+V, ctrl+T(!)

Jedną z najczęściej wykonywanych operacji w pracy z komputerem jest “kopiuj (wytnij) -> wklej”. Wiąże się to z użyciem kombinacji klawiszy “ctrl+C (crtl+X) -> ctrl+V”. Ten wspaniały mechanizm pozwala na powielanie (przenoszenie), a dzięki temu szybsze programowanie ;), dowolnego tekstu czy grafiki. Efektem ubocznym (choć czasami pożądanym) jest przenoszenie formatowania wraz z kopiowaną zawartością. czytaj dalej

Quick Tip: 07. Firefox – Smart keywords

Dzisiaj krótko na temat, jak ułatwić sobie pracę z Firefoxem.

Firefox posiada bardzo przydatny mechanizm – “Smart keywords“. Umożliwia on definiowanie słów kluczowych dla pól wyszukiwania na stronach.

Aby dodać nowe słowo kluczowe klikamy prawym przyciskiem myszki na danym polu i wybieramy: “Utwórz słowo kluczowe dla tej wyszukiwarki…“,

ff1

w nowym okienku “Nowa zakładka” podajemy nazwę zakładki oraz słowo kluczowe.

Dla google można zrobić tak:

ff2

po takiej konfiguracji w przeglądarce (jako adres) wpisujemy np. “g asp.net”  i uzyskujemy wyniki wyszukiwania dla asp.net :)

Takie skróty możemy definiować dla dowolnego pola na stronie www.

Ja np. często korzystam  ze skrótu “b + numer issue” jako odwołanie do BugTrackera.

Proste i bardzo przydatne :)

Quick Tip: 06. zamieniamy URL na link

Dzisiaj prosty przykład jak w tekście zamienić url na link, czyli np. użytkownik wpisuje:

“Zapraszam na moją stronę http://gasior.net.pl”

a my wyświetlając ten tekst chcemy otrzymać coś takiego

“Zapraszam na moją stronę <a href=”http://gasior.net.pl”>http://gasior.net.pl</a>

Z pomocą przychodzą wyrażenia regularne:

[sourcecode language=”csharp”]
protected string ConvertUrlsToLinks(string msg)
{
Regex r = new Regex("(http://[^ ]+)");
return r.Replace(msg, "<a href="$1">$1</a>");
}
[/sourcecode]

Jeżeli zachodzi taka potrzeba możemy ten sam efekt uzyskać w JavaScripcie:

[sourcecode language=”csharp”]
var objRegExp = /(http:[^ ]+)/g;
var convertedValue = msg.replace(objRegExp, "<a href=’$1′>$1</a>");
[/sourcecode]

EDIT:
w nawiązaniu do słusznej uwagi z komentarza (użytkownik apl) podaję poprawioną, dokładniejszą metodę:
[sourcecode language=”csharp”]
var reg = @"((www.|(http|https)+://)[&#95;.a-z0-9-]+.[a-z0-9/&#95;:@=.+?,##%&~-]*[^.|’|# |!|(|?|,| |>|<|;|)])";
Regex r = new Regex(reg, RegexOptions.IgnoreCase);
return r.Replace(msg, "<a href="$1">$1</a>").Replace("href="www", "href="http://www");
[/sourcecode]

Quick Tip: 05. waliduj dane w formacie w jakim je wyświetlasz

Często dane, które posiadamy musimy odpowiednio sformatować przed ich wyświetleniem.
Jeżeli takie dane musimy zwalidować, to warto zadbać, aby walidowane dane były  w takim samym formacie jak je wyświetlamy.

Prosty przykład:

Powiedzmy, że mamy metodę pobierającą kwotę faktury:

[sourcecode language=”csharp”]

var invoiceBalance = GetInvoiceBalance();

[/sourcecode]

Kwotę tą otrzymujemy z dokładnością do 4 miejsc po przecinku.
Jednak przez wyświetleniem formatujemy ją:

[sourcecode language=”csharp”]

litInvoiceBalance.Text = invoiceBalance.ToString("C");

[/sourcecode]

Co w wyświetli nam np. 100,00 zł.
Jak widać nasza zmienna wyświetlana jest z dokładnością do 2 miejsc po przecinku.

Dodatkowo załóżmy, że jeżeli pobrana kwota jest większa od 0, umożliwimy użytkownikowi zaznaczenie RadioButton’a, czyli:

[sourcecode language=”csharp”]

if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}

[/sourcecode]

Niby wszystko ok – aplikacja działa. Jeśli kwota jest większa od 0 możemy zaznaczyć RadioButton’a, a jeśli nie to nie możemy.

Problem pojawi się w sytuacji, kiedy nasza procedura zwróci np. 0,0010.
Co wówczas zrobi nasz program? Wyświetli 0,00 zł, ale jednocześnie pozwoli zaznaczyć RadioButton’a :(
Dzieje się tak, ponieważ 0,0010 zaokrąglone do dwóch miejsc po przecinku da nam 0,00, ale podczas walidowania kwota jest większa od zera.

Tego typu błędy są czasami ciężkie do wykrycia – kompilator nic nie zgłosi, a i sam błąd występuje rzadko.

Rozwiązaniem w tym przypadku jest zaokrąglenie naszej kwoty przed wyświetleniem i zwalidowaniem, czyli:

[sourcecode language=”csharp” highlight=”3″]
var invoiceBalance = GetInvoiceBalance();

invoiceBalance = Math.Round(invoiceBalance, 2);

litInvoiceBalance.Text = invoiceBalance.ToString("C");

if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}

[/sourcecode]

Warto zwrócić uwagę na takie sytuacje.

Quick Tip: 04. przeszukuj kolekcje z where zamiast foreach

LINQ udostępnia metodę where, która umożliwia przeszukiwanie kolekcji tak jak foreach.

Przykładowo, zamiast:

[sourcecode language=”csharp”]
var polishCustomers = new List<Customer>();

foreach (var customer in customers)
{
if (customer.Country == "Poland")
polishCustomers.Add(customer);
}
[/sourcecode]

możemy użyć

[sourcecode language=”csharp”]
var polishCustomers = customers.Where(x => x.Country == "Poland");
[/sourcecode]

czyli krótko, zwięźle i na temat :)

Oczywiście wcześniej musimy dodać using System.Linq;

Quick Tip: 03. Stosuj nagłówki

Przeglądając źródła różnych stron www (HTML) często można znaleźć taki kod:

[sourcecode language=”xhtml”]

<span class="bigHeader">Mój Nagłówek</span>

<span class="newsTitle">Mój News</span>

[/sourcecode]

W ten sposób za pomocą CSS ustalamy wygląd nagłówków, tytułów artykłów, newsów, itp. Np. na codeguru.pl każdy news na stronie głównej wygląda tak:

[sourcecode language=”xhtml”]

<a class="bigWindowTitleLinked" title="tytuł" href=&#039;/url.aspx&#039;>News</a>

[/sourcecode]

Jednak pod względem optymalizacji SEO dużo lepszym rozwiązaniem jest stosowanie nagłówków <h1>, <h2>, <h3>,  itd. W ten sposób określamy ważność tekstu na stronie (<h1> jest ważniejszy od <h2>). Dla podanych przykładów wyglądałoby to tak:

[sourcecode language=”xhtml”]

<h2>Mój Nagłówek</h2>

<h2>Mój News</h2>

[/sourcecode]

Składnia prostsza, krótsza i lepiej interpretowana przez wyszukiwarki.

A dlaczego <h2> a nie <h1>? Wszystko zależy od tego, jak chcemy ustalić hierachię informacji na stronie. Jestem zwolennikiem stosowania nagłówka dla nazwy strony np.:

[sourcecode language=”xhtml”]

<h1>Mój portal</h1>

[/sourcecode]

Zmiana class=”bigHeader” na nagłówki trudna nie jest :), a zyskujemy bardzo dużo na jakości kodu w “oczach” przeglądarek.