<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Dariusz Gil - DARIO-G - programista, projektant</title>
    <description>Dariusz Gil - DARIO-G - programista, projektant</description>
    <link>http://dario-g.com/</link>
    <language>pl</language>
    <lastBuildDate>Wed, 10 Mar 2010 23:28:23 GMT</lastBuildDate>
    <generator>dario_g RssGenerator 1.0.2970.19256</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dario-g" /><feedburner:info uri="dario-g" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Dariusz Gil - DARIO-G - programista, projektant</itunes:subtitle><item>
      <title>Softio.pl w grupie fajnych stron w kolorze fioletowym</title>
      <description>
Moja strona firmowa &lt;a href="http://softio.pl"&gt;Softio.pl&lt;/a&gt; &lt;a href="http://spyrestudios.com/25-kick-ass-purple-portfolio-website-designs/"&gt;została wyr&amp;oacute;żniona&lt;/a&gt; przez Spyrestudios (należący do grupy &lt;a href="http://www.smashingmagazine.com/the-smashing-network/"&gt;Smashing Network&lt;/a&gt;) i znalazła się w spisie 25 fajnych stron, gdzie kolorem dominującym jest fiolet. :)

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=78.jpg" alt="Softio na Spyrestudios" /&gt;
&lt;/div&gt;

Ot, tak chciałem się pochwalić :) 

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/qQAI73zZpfw/Softiopl-w-grupie-fajnych-stron-w-kolorze-fioletowym-0-124.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Softiopl-w-grupie-fajnych-stron-w-kolorze-fioletowym-0-124.aspx</guid>
      <pubDate>Tue, 10 Nov 2009 00:45:31 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Softiopl-w-grupie-fajnych-stron-w-kolorze-fioletowym-0-124.aspx</feedburner:origLink></item>
    <item>
      <title>ASP.NET MVC 2.0 Beta i licencja GoLive</title>
      <description>
Phil Haack&amp;#160; poinformował, że &lt;a href="http://haacked.com/archive/2009/11/17/asp.net-mvc-2-beta-released.aspx"&gt;ASP.NET MVC 2.0 w wersji Beta jest już dostępny&lt;/a&gt;. Ważniejsze jednak jest to, że wersja ta posiada odpowiedni zapis w licencji pozwalający na używanie ASP.NET MVC 2 w aplikacjach używanych produkcyjnie.


Innymi słowy jeśli ktoś planuje w najbliższym czasie udostępnić/sprzedać program oparty o ten framework i chciałby użyć w niej funkcjonalności z wersji 2.0 to od tego momentu już spokojnie można. &lt;a href="/ASPNET-MVC-20-Preview-1-0-110.aspx"&gt;Data annotations i typowane helpery do budowy interfejsu oraz szablony helper&amp;oacute;w&lt;/a&gt; kuszą, a jakże. :)


&amp;#160;

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=79.jpg" alt="asp.net mvc" /&gt;
&lt;/div&gt;

&amp;#160;


Oczywiście należy pamiętać, że nie jest to jeszcze pełna wersja, więc do system&amp;oacute;w strategicznych jeszcze się nie nadaje. :) 


&amp;#160;

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/22o0BMeTcZI/ASPNET-MVC-20-Beta-i-licencja-GoLive-0-125.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/ASPNET-MVC-20-Beta-i-licencja-GoLive-0-125.aspx</guid>
      <pubDate>Tue, 17 Nov 2009 21:54:13 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/ASPNET-MVC-20-Beta-i-licencja-GoLive-0-125.aspx</feedburner:origLink></item>
    <item>
      <title>Mini Static Content Delivery - paczki i konfiguracja</title>
      <description>
W poprzednim poście poświęconym Mscd opisałem możliwości. Teraz zajmę się sposobem tworzenia paczek. Tak jak już wspominałem Paczki dają możliwość upakowania wielu plik&amp;oacute;w jednego rodzaju i wysłanie zawartości w odpowiedzi na jedno żądanie.


Paczka do działania nie potrzebuje żadnej konfiguracji. Wystarczy utworzyć katalog i wgrać do niego pliki.


Mamy do dyspozycji dwa rodzaje paczek. Paczki z kontentem JavaScript (pliki *.js) oraz Stylesheet aka styles (pliki *.css).


&amp;#160;


&lt;u&gt;&lt;strong&gt;Tworzenie paczki&lt;/strong&gt;&lt;/u&gt; 


Zakładając, że stworzymy paczkę styli należy w katalogu gł&amp;oacute;wnym naszej aplikacji serwującej kontent statyczny utworzyć katalog &lt;strong&gt;&amp;quot;styles&amp;quot;&lt;/strong&gt;. Każdy katalog znajdujący się w &lt;em&gt;styles&lt;/em&gt; będzie paczką, kt&amp;oacute;ra może zawierać zero lub więcej plik&amp;oacute;w.


Paczkę ze skryptami robi się analogicznie, przyczym katalog z takimi paczkami nazywamy &amp;quot;&lt;strong&gt;scripts&lt;/strong&gt;&amp;quot;.


Przykład:

&lt;ul&gt;
	&lt;li&gt;styles&lt;/li&gt;
	&lt;li&gt;&amp;#160;&amp;#160;&amp;#160; admin&lt;/li&gt;
	&lt;li&gt;&amp;#160;&amp;#160;&amp;#160; portal &lt;/li&gt;
&lt;/ul&gt;

Powyższy układ katalogu definiuje nam dwie paczki dla css&amp;oacute;w. Paczkę &lt;em&gt;admin&lt;/em&gt; co sugeruje, że tu będą się znajdować pliki formatujące wyświetlanie części administracyjnej oraz paczkę &lt;em&gt;portal&lt;/em&gt;, czyli style dla stron portalu. :)


&amp;#160;


&lt;u&gt;&lt;strong&gt;Jak używać?&lt;/strong&gt;&lt;/u&gt; 


Nie pisałem o tym wcześniej, ale w projekcie klienckim, czyli takim, kt&amp;oacute;ry korzysta z usług Mscd korzystamy z metod, kt&amp;oacute;re dostarcza &amp;quot;&lt;strong&gt;Softio.Mscd.Client&lt;/strong&gt;&amp;quot;.


Biblioteczka ta definiuje szereg metod, kt&amp;oacute;re pozwalają nam w zautomatyzowany spos&amp;oacute;b odwoływać się kodzie HTML po zasoby wystawiane przez Mscd.


Wszystkie metody są zaimplementowane w klasie &lt;strong&gt;StaticFile&lt;/strong&gt;.Przykładowe użycia są dostepne w projekcie &lt;a href="http://mscd.codeplex.com/SourceControl/ListDownloadableCommits.aspx"&gt;Mscd.Example, kt&amp;oacute;ry można pobrać z CodePlex&lt;/a&gt;.


&lt;strong&gt;Metody StylesPackage/ScriptsPackage &lt;/strong&gt;


Metoda ta tworzy link odwołujący się do paczki o podanej nazwie.Na przykład:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;span&gt;&amp;lt;link type=&lt;span&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; media=&lt;span class="str"&gt;&amp;quot;projection, screen&amp;quot;&lt;/span&gt; href=&lt;span class="str"&gt;&amp;quot;&amp;lt;%=StaticFile.StylesPackage(&amp;quot;&lt;/span&gt;portal&lt;span class="str"&gt;&amp;quot;) %&amp;gt;&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

Oczywiście lepiej mieć metodę, kt&amp;oacute;ra nam zbuduje tag &lt;strong&gt;LINK&lt;/strong&gt; i&lt;strong&gt; &lt;/strong&gt;wtedy wywołanie wyglądało by tak:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&amp;lt;%=Html.StyleSheet(StaticFile.StylesPackage(&lt;span class="str"&gt;&amp;quot;portal&amp;quot;&lt;/span&gt;)) %&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;

Wynik działania:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&amp;lt;link href=&amp;quot;http://static.softio.pl/styles/Site_Default_vFF05165E.css&amp;quot; media=&amp;quot;all&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;

Wywołanie dla skrypt&amp;oacute;w działa analogicznie.


&lt;strong&gt;Metoda Href&lt;/strong&gt; 


Metoda Href pozwala na odwołanie się do dowolnego (pojedynczego) pliku, kt&amp;oacute;ry jest wystawiany przez Mscd oraz nie znajduje się w paczce. Bardzo dobrze sprawdza się do obrazk&amp;oacute;w. Odwołanie takie daje nam buforowanie i wersjonowanie, o czym już wcześniej pisałem.


Przykład:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&amp;lt;%=Html.Image(StaticFile.Href(&lt;span class="str"&gt;&amp;quot;images/bizpark.png&amp;quot;&lt;/span&gt;), &lt;span class="str"&gt;&amp;quot;Softio jest uczestnikiem programu Microsoft BizPark&amp;quot;&lt;/span&gt;) %&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;

Wynik działania metody:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&amp;lt;img src=&amp;quot;http://static.softio.pl/images/bizpark_vC45B22D2.png&amp;quot; alt=&amp;quot;Softio jest uczestnikiem programu Microsoft BizPark&amp;quot; title=&amp;quot;Softio jest uczestnikiem programu Microsoft BizPark&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;

&amp;#160;


&lt;u&gt;&lt;strong&gt;Konfiguracja Mscd.Server&lt;/strong&gt;&lt;/u&gt;


Po stronie projektu serwującego kontent mamy możliwość ustawienia kilku parametr&amp;oacute;w. Poniżej spis wszystkich możliwości, kt&amp;oacute;re definiuje się w pliku web.config w sekcji appSettings. 


&lt;em&gt;&lt;strong&gt;MSCD.ExpiredInDays (domyślnie 0)&lt;/strong&gt;&lt;/em&gt; 


Określa ilość czasu (w dniach) ile kontent ma pozostać w buforze przeglądarki.


&lt;em&gt;&lt;strong&gt;MSCD.ContentEncoding (domyślnie UTF8)&lt;/strong&gt;&lt;/em&gt;


Określa kodowanie plik&amp;oacute;w js i css.


&lt;em&gt;&lt;strong&gt;MSCD.AllowedFileTypes (domyślnie: .CSS, .JS, .HTML, .HTM, .PNG, .JPEG, .JPG, .GIF, .BMP, .SWF, .TXT)&lt;/strong&gt;&lt;/em&gt; 


Określa rozszerzenia plik&amp;oacute;w, kt&amp;oacute;re są obsługiwane przez Mscd. W innym przypadku plik będzie wystawiany standardowo przez IIS.


&lt;em&gt;&lt;strong&gt;MSCD.CompressedFileTypes (domyślnie: .CSS, .HTML, .HTM)&lt;/strong&gt;&lt;/em&gt;


Określa rozszerzenia plik&amp;oacute;w, kt&amp;oacute;re będą kompresowane (GZip lub Deflate).


&lt;em&gt;&lt;strong&gt;MSCD.RootDirectory (domyślnie: pusty_string)&lt;/strong&gt;&lt;/em&gt;


Określa nazwę katalogu, gdzie znajdują się katalogi &lt;em&gt;styles&lt;/em&gt; i &lt;em&gt;scripts&lt;/em&gt;. Dzięki temu można przenieść je z katalogu gł&amp;oacute;wnego w inne miejsce, na przykład:&lt;em&gt; /packages&lt;/em&gt;.


&amp;#160;


&lt;u&gt;&lt;strong&gt;Konfiguracja Mscd.Client&lt;/strong&gt;&lt;/u&gt; 


Po stronie HTMLa,&amp;#160; gdzie wstawiamy kod odwołujący się do zasob&amp;oacute;w mamy następujące możliwości konfiguracji:


&lt;strong&gt;MSCD.ResourcesDirectory (wymagane)&lt;/strong&gt;


Określa katalog fizyczny na dysku, gdzie znajdują się zasoby udostępniane przez Mscd. Potrzebne jest to do kontrolowania zmiany wersji.


Jeśli aplikacja Mscd jest podkatalogiem dla aplikacji gł&amp;oacute;wnej (bardzo często tak jest w przypadku usług hostingowych) lub Mscd.Server jest tą samą aplikacją co aplikacja gł&amp;oacute;wna to można podać ścieżkę virtualną, na przykład &amp;quot;~/static&amp;quot;, kt&amp;oacute;ra zostanie zamieniona wewnątrz na fizyczną. 


&lt;strong&gt;MSCD.StaticSiteAddress (wymagane)&lt;/strong&gt; 


Adres aplikacji Mscd, na przykład: &lt;em&gt;http://static.softio.pl&lt;/em&gt;. 


Ciekawostką jest to iż&amp;#160; adres także można podać jako adres virtualny, na przykład: ~/static. Takie użycie ma sens, kiedy aplikacja Mscd nie ma osobnej domeny, a jest jednie katalogiem virtualnym na tym samym serwerze co aplikacja gł&amp;oacute;wna.


&lt;strong&gt;MSCD.StaticSiteSecuredChannel (nie wymagane, domyślnie: false)&lt;/strong&gt; 


Określa czy dostęp do aplikacji Mscd jest kanałem szyfrowanym (https).


&amp;#160;


Pełny opis API na CodePlex już niedługo, a w następnym poście o Mscd - instalacja. 

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/SodUhloF_bQ/Mini-Static-Content-Delivery---paczki-i-konfiguracja-0-126.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Mini-Static-Content-Delivery---paczki-i-konfiguracja-0-126.aspx</guid>
      <pubDate>Thu, 19 Nov 2009 01:13:57 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Mini-Static-Content-Delivery---paczki-i-konfiguracja-0-126.aspx</feedburner:origLink></item>
    <item>
      <title>Białe znaki (white space) w Visual Studio</title>
      <description>
Taka mała ciekawostka. Jak włączyć widoczność białych znak&amp;oacute;w w Visual Studio 2008? Wystarczy kombinacja klawiszy:

&lt;p align="center"&gt;
&lt;strong&gt;Ctrl + E + S&lt;/strong&gt; 

&lt;p align="left"&gt;
Kombinacja działa naprzemiennie, tzn. wciskając ją ponownie oznaczenie białych znak&amp;oacute;w zniknie. U mnie widać je tak:


&amp;#160;

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=80.jpg" /&gt;
&lt;/div&gt;

&amp;#160;

&lt;p align="left"&gt;
Niestety nie jestem w stanie sprawdzić czy ten skr&amp;oacute;t działa w VS 2005, ale domniemam, że tak. :) 


&amp;#160;

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/Vbkr6fLSA-I/Biale-znaki-white-space-w-Visual-Studio-0-127.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Biale-znaki-white-space-w-Visual-Studio-0-127.aspx</guid>
      <pubDate>Fri, 20 Nov 2009 00:23:12 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Biale-znaki-white-space-w-Visual-Studio-0-127.aspx</feedburner:origLink></item>
    <item>
      <title>Pracujesz w domu - musisz takie mieć ;)</title>
      <description>
Niedawno minął rok, odkąd pracuję w domu. Bywa r&amp;oacute;żnie, czasem Oskarek poprzeszkadza, czasem człowiek rozproszy swoją uwagę na coś innego, ale og&amp;oacute;lnie, muszę sobie przyznać, że potrafię się skupić na robocie.


Szczeg&amp;oacute;lnie pomocne są przy tym słuchawki :) Do tej pory miałem takie malutkie, douszne, ale.... dźwięk nie ten.


Niedawno zakupiłem troszkę większe. Zakup w sumie budżetowy, ale jakość dźwięku jak dla mnie super.


&amp;#160;

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=81.jpg" alt="Sennheiser HD 202" /&gt;
&lt;/div&gt;

&amp;#160;


Teraz mogę nawet 14 godzin non-stop... Oczywiście żartuję, ale wszystkim tym, kt&amp;oacute;rzy zastanawiają się nad wyborem, polecam. Szczeg&amp;oacute;lnie do laptopa, kt&amp;oacute;ry nie ma zbyt dobrej karty dźwiękowej. :)

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/kOdclM66Vuo/Pracujesz-w-domu---musisz-takie-miec--0-128.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Pracujesz-w-domu---musisz-takie-miec--0-128.aspx</guid>
      <pubDate>Sat, 21 Nov 2009 01:00:48 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Pracujesz-w-domu---musisz-takie-miec--0-128.aspx</feedburner:origLink></item>
    <item>
      <title>Nowy Rok 2010</title>
      <description>
Samych sukces&amp;oacute;w w Nowym Roku, oby spełniły się wszystkie marzenia, nawet te najbardziej skryte :)


&amp;#160;

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=82.jpg" /&gt;
&lt;/div&gt;

&amp;#160;


Oby wszystkie projekty ukończyły się terminowo, zmieściły się w budżecie i klienci byli zadowoleni :)


Tego wszystkim Wam i sobie życzę :)


&amp;#160;

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/P9f0fTyKkFc/Nowy-Rok-2010-0-129.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Nowy-Rok-2010-0-129.aspx</guid>
      <pubDate>Fri, 01 Jan 2010 12:17:45 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Nowy-Rok-2010-0-129.aspx</feedburner:origLink></item>
    <item>
      <title>UpdateModel bez stringów</title>
      <description>
Metoda UpdateModel jest metodą dostępną w klasie kontrolera, kt&amp;oacute;ra w automagiczny spos&amp;oacute;b przepisze wartości przesłane z formularza do naszego obiektu modelu. Niestety przepisze wszystkie jakie tylko zostały przesłane. A co jeśli nie chcemy przepisywać wszystkich? Wystarczy podać listę dopuszczonych wartości do przepisywania. Niestety lista ta to nic innego jak array string&amp;oacute;w.


Poniżej prezentuję kawałek kodu, kt&amp;oacute;ry dzięki kilku prostym zabiegom pozwala na typowane przekazanie listy właściwości. Stringi won! 


Najpierw stworzyłem bazową klasę kontrolera, kt&amp;oacute;ra zawiera spreparowaną metodę UpdateModel. Niestety nie da się użyć ExtensionsMethod, gdyż UpdateModel jest protected.

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; abstract &lt;span class="kwrd"&gt;class&lt;/span&gt; ControllerExt : Controller
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateModel(TModel model, &lt;span class="kwrd"&gt;params&lt;/span&gt; Expression&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;[] property) &lt;span class="kwrd"&gt;where&lt;/span&gt; TModel : &lt;span class="kwrd"&gt;class&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        var props = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(property.Length);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var p &lt;span class="kwrd"&gt;in&lt;/span&gt; property)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            var memberExpression = RemoveUnary(p.Body) &lt;span class="kwrd"&gt;as&lt;/span&gt; MemberExpression;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (memberExpression == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NullReferenceException(&lt;span class="str"&gt;&amp;quot;Can not retrieve info about member of {0}&amp;quot;&lt;/span&gt;.FormatThis(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TModel).Name));
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            props.Add(memberExpression.Member.Name);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.UpdateModel(model, props.ToArray());
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Expression RemoveUnary(Expression body)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        var unary = body &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (unary != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; unary.Operand;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; body;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;

Dzięki temu zabiegowi każdy kontroler dziedziczący po naszym nowym kontrolerze bazowym będzie wyposażony w metodę, kt&amp;oacute;rej użycie wygląda następująco:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Gdzieś w metodzie akcji kontrolera&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;UpdateModel&amp;lt;MyModel&amp;gt;(model, x =&amp;gt; x.Number);
&lt;/pre&gt;
&lt;/div&gt;

Oczywiście można tu się pokusić o jakąś optymalizację i buforowanie listy właściwości dla podanego typu modelu. Miłej zabawy :)

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/ooB9ZGMwv6Q/UpdateModel-bez-stringow-0-130.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/UpdateModel-bez-stringow-0-130.aspx</guid>
      <pubDate>Sun, 24 Jan 2010 22:08:58 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/UpdateModel-bez-stringow-0-130.aspx</feedburner:origLink></item>
    <item>
      <title>FormatWith - inne implementacje</title>
      <description>
&lt;a href="http://kurzyniec.pl/article/FormatWith_2.0.php"&gt;Łukasz Kurzyniec&lt;/a&gt; wspomniał o bardzo fajnym sposobie formatowania stringa, gdzie zamiast kolejnych indeks&amp;oacute;w {0}, {1}, itd podaje się nazwy właściwości, a jako źr&amp;oacute;dło obiekt je posiadający. Niestety nie mogłem dodać komentarza na blogu Łukasza, stąd ten post.


Swego czasu &lt;a href="http://haacked.com/archive/2009/01/14/named-formats-redux.aspx"&gt;Phill Haack&lt;/a&gt; zainteresował się tym tematem i pokazał inne implementacje. Obecnie dzięki Niemu używam implementacji Henri'ego, kt&amp;oacute;ra to mimo większej ilości kodu okazała się najszybsza.


Dodatkowo w swojej implementacji dodałem jedno przeciążenie, dzięki kt&amp;oacute;remu możemy określi czy brak właściwości odpowiadającej znalezionemu parametrowi ma wyrzucić wyjątek czy też nie. Przydatne przy bardziej zaawansowanym formatowaniu/parsowaniu. 


Poniżej przeklejam kod, aby nigdzie się nie zgubił ;) Acha, u mnie ta metoda nazywa się &lt;strong&gt;FormatNamed&lt;/strong&gt;.

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FormatNamed(&lt;span class="kwrd"&gt;this&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; format, &lt;span class="kwrd"&gt;object&lt;/span&gt; source)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; FormatNamed(format, source, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FormatNamed(&lt;span class="kwrd"&gt;this&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; format, &lt;span class="kwrd"&gt;object&lt;/span&gt; source, &lt;span class="kwrd"&gt;bool&lt;/span&gt; ignoreNotFound)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (format == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;format&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    StringBuilder result = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(format.Length * 2);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(format))
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        StringBuilder expression = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; @&lt;span class="kwrd"&gt;char&lt;/span&gt; = -1;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        State state = State.OutsideExpression;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;do&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (state)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; State.OutsideExpression:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                    @&lt;span class="kwrd"&gt;char&lt;/span&gt; = reader.Read();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (@&lt;span class="kwrd"&gt;char&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; -1:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                            state = State.End;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;'{'&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                            state = State.OnOpenBracket;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;'}'&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                            state = State.OnCloseBracket;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;default&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  39:  &lt;/span&gt;                            result.Append((&lt;span class="kwrd"&gt;char&lt;/span&gt;)@&lt;span class="kwrd"&gt;char&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  40:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  41:  &lt;/span&gt;                    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; State.OnOpenBracket:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  44:  &lt;/span&gt;                    @&lt;span class="kwrd"&gt;char&lt;/span&gt; = reader.Read();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  45:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (@&lt;span class="kwrd"&gt;char&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  46:  &lt;/span&gt;                    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; -1:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; FormatException();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;'{'&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                            result.Append(&lt;span class="str"&gt;'{'&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  51:  &lt;/span&gt;                            state = State.OutsideExpression;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  53:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;default&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                            expression.Append((&lt;span class="kwrd"&gt;char&lt;/span&gt;)@&lt;span class="kwrd"&gt;char&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                            state = State.InsideExpression;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  56:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  57:  &lt;/span&gt;                    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  58:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  59:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; State.InsideExpression:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                    @&lt;span class="kwrd"&gt;char&lt;/span&gt; = reader.Read();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  61:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (@&lt;span class="kwrd"&gt;char&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  62:  &lt;/span&gt;                    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  63:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; -1:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  64:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; FormatException();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  65:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;'}'&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  66:  &lt;/span&gt;                            result.Append(OutExpression(source, expression.ToString(), ignoreNotFound));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  67:  &lt;/span&gt;                            expression.Length = 0;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  68:  &lt;/span&gt;                            state = State.OutsideExpression;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  69:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  70:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;default&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  71:  &lt;/span&gt;                            expression.Append((&lt;span class="kwrd"&gt;char&lt;/span&gt;)@&lt;span class="kwrd"&gt;char&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  72:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  73:  &lt;/span&gt;                    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  74:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  75:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; State.OnCloseBracket:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  76:  &lt;/span&gt;                    @&lt;span class="kwrd"&gt;char&lt;/span&gt; = reader.Read();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  77:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (@&lt;span class="kwrd"&gt;char&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  78:  &lt;/span&gt;                    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  79:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;'}'&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  80:  &lt;/span&gt;                            result.Append(&lt;span class="str"&gt;'}'&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  81:  &lt;/span&gt;                            state = State.OutsideExpression;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  82:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  83:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;default&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  84:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; FormatException();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  85:  &lt;/span&gt;                    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  86:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  87:  &lt;/span&gt;                &lt;span class="kwrd"&gt;default&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  88:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span class="str"&gt;&amp;quot;Invalid state.&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  89:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  90:  &lt;/span&gt;        } &lt;span class="kwrd"&gt;while&lt;/span&gt; (state != State.End);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  91:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  92:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  93:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; result.ToString();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  94:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  95:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  96:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; OutExpression(&lt;span class="kwrd"&gt;object&lt;/span&gt; source, &lt;span class="kwrd"&gt;string&lt;/span&gt; expression, &lt;span class="kwrd"&gt;bool&lt;/span&gt; ignoreNotFound)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  97:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  98:  &lt;/span&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; format = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  99:  &lt;/span&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; orygexpression = expression;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 100:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 101:  &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; colonIndex = expression.IndexOf(&lt;span class="str"&gt;':'&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 102:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (colonIndex &amp;gt; 0)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 103:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 104:  &lt;/span&gt;        format = expression.Substring(colonIndex + 1);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 105:  &lt;/span&gt;        expression = expression.Substring(0, colonIndex);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 106:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 107:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 108:  &lt;/span&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 109:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 110:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(format))
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 111:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 112:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (DataBinder.Eval(source, expression) ?? &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;).ToString();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 113:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 114:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; DataBinder.Eval(source, expression, &lt;span class="str"&gt;&amp;quot;{0:&amp;quot;&lt;/span&gt; + format + &lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;) ?? &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 115:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 116:  &lt;/span&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (HttpException)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 117:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 118:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!ignoreNotFound)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 119:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 120:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; FormatException();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 121:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 122:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 123:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 124:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; orygexpression;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 125:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 126:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 127:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 128:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 129:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; State
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 130:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 131:  &lt;/span&gt;    OutsideExpression,
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 132:  &lt;/span&gt;    OnOpenBracket,
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 133:  &lt;/span&gt;    InsideExpression,
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 134:  &lt;/span&gt;    OnCloseBracket,
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt; 135:  &lt;/span&gt;    End
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt; 136:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;

&amp;#160;

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/3JYpuugn2mg/FormatWith---inne-implementacje-0-131.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/FormatWith---inne-implementacje-0-131.aspx</guid>
      <pubDate>Mon, 25 Jan 2010 00:43:13 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/FormatWith---inne-implementacje-0-131.aspx</feedburner:origLink></item>
    <item>
      <title>web.config dla widoków asp.net mvc</title>
      <description>
Poprawne widoki w projekcie asp.net mvc nie powinny posiadać plik&amp;oacute;w codebehind. Ponadto nie powinny posiadać żadnej logiki. Mają służyć jedynie prezentacji/wizualizacji danych oraz zbierania informacji, kt&amp;oacute;re będą przesyłane do kontrolera.


W związku z tym całe ustrojstowo typu auto-zdarzenia (znane z WebForms'&amp;oacute;w), viewstate'y, czy nawet dostęp do obiektu sesji powinno być wyłączone/zablokowane.


Wybrane wartości:

&lt;ul&gt;
	&lt;li&gt;autoEventWireup=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;compilationMode=&amp;quot;Auto&amp;quot;&lt;/li&gt;
	&lt;li&gt;enableEventValidation=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;enableViewState=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;enableViewStateMac=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;maintainScrollPositionOnPostBack=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;viewStateEncryptionMode=&amp;quot;Never&amp;quot;&lt;/li&gt;
	&lt;li&gt;smartNavigation=&amp;quot;false&amp;quot;&lt;/li&gt;
	&lt;li&gt;enableSessionState=&amp;quot;ReadOnly&amp;quot;&lt;/li&gt;
	&lt;li&gt;validateRequest=&amp;quot;false&amp;quot; 
	&lt;/li&gt;
&lt;/ul&gt;

Poniżej zamieszczam do pobrania web.config dla MVC 1.0, kt&amp;oacute;ry zawiera odpowiednio wpisane wartości. Podany plik należy wgrać do katalogu Views.


&lt;a href="/files/WebConfigMVC10.zip"&gt;Pobierz web.config z katalogu Views dla ASP.NET MVC 1.0&lt;/a&gt;


&amp;#160;

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/3tKvoXS9Xek/webconfig-dla-widokow-aspnet-mvc-0-132.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/webconfig-dla-widokow-aspnet-mvc-0-132.aspx</guid>
      <pubDate>Tue, 26 Jan 2010 00:59:51 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/webconfig-dla-widokow-aspnet-mvc-0-132.aspx</feedburner:origLink></item>
    <item>
      <title>Kilka metod ułatwiających pracę z obiektem sesji</title>
      <description>
Przechowywanie obiekt&amp;oacute;w w sesji nie jest og&amp;oacute;lnie wskazane ze względu na szybkość działania strony (poza typem InProc) jak i ulotność miejsca składowania (InProc). Mimo wszystko czasami trzeba. Aby ułatwić sobie pracę z obiektem sesji napisałem kilka pomocniczych metod rozszerzających możliwości HttpSessionStateBase.


Bardzo często zdarzają się przypadki przechowania czegoś na chwilę w kontekście użytkownika. Określamy zatem jakiś klucz i dodajemy do sesji. W innym miejscu aplikacji zn&amp;oacute;w musimy posłużyć się tym samym kluczem, pod kt&amp;oacute;rym schowaliśmy sobie jakieś dane w sesji.


A gdyby tak pozbyć się tego klucza i tworzyć go po cichu automatycznie?


Na takim pomyśle opiera się działanie poniższych metod. Oczywiście nie zawsze da się pozbyć klucza dlatego też wszystkie metody mają dodatkowe przeciążenie. Dodatkowo wszystkie metody są typowane.


Podstawowymi działaniami są zapamiętanie obiektu w sesji i jego pobranie. Do tego służą odpowiednio metody AddItem oraz GetItem.


Przykładowo zapamiętujemy i odczytujemy obiekt typu UserContext w następujący spos&amp;oacute;b:

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;var ctx = &lt;span class="kwrd"&gt;new&lt;/span&gt; UserContext();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;Session.AddItem&amp;lt;UserContext&amp;gt;(ctx);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="rem"&gt;// ...&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="rem"&gt;// W innym miejscu aplikacji&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;var ctx2 = Session.GetItem&amp;lt;UserContext&amp;gt;();
&lt;/pre&gt;
&lt;/div&gt;

Kod całej klasy zawierającej wszystkie metody znajduje się poniżej.

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; HttpSessionExtensions
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s, T &lt;span class="kwrd"&gt;value&lt;/span&gt;) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        AddItem&amp;lt;T&amp;gt;(s, &lt;span class="kwrd"&gt;value&lt;/span&gt;, &amp;quot;&amp;quot;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s, T &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt; key)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        s.Add(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).FullName + key, &lt;span class="kwrd"&gt;value&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T GetItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; GetItem&amp;lt;T&amp;gt;(s, &amp;quot;&amp;quot;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T GetItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s, &lt;span class="kwrd"&gt;string&lt;/span&gt; key)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        var &lt;span class="kwrd"&gt;value&lt;/span&gt; = s[&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).FullName + key];
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt;  &lt;span class="kwrd"&gt;value&lt;/span&gt; == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? &lt;span class="kwrd"&gt;default&lt;/span&gt;(T) : (T)s[&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).FullName + key];
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T TakeItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; TakeItem&amp;lt;T&amp;gt;(s, &amp;quot;&amp;quot;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T TakeItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s, &lt;span class="kwrd"&gt;string&lt;/span&gt; key)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  30:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        var &lt;span class="kwrd"&gt;value&lt;/span&gt; = GetItem&amp;lt;T&amp;gt;(s, key);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        RemoveItem&amp;lt;T&amp;gt;(s, key);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  34:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  35:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  36:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RemoveItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  37:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        RemoveItem&amp;lt;T&amp;gt;(s, &amp;quot;&amp;quot;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  39:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;#160;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  41:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RemoveItem&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; HttpSessionStateBase s, &lt;span class="kwrd"&gt;string&lt;/span&gt; key)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  42:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        s.Remove(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).FullName + key);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  44:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  45:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;

Nie będę opisywał wszystkich pokolei, bo doskonale widać co każda z nich robi.


Proszę się częstować :)


PS&lt;br /&gt;
Tak naprawdę są to metody, kt&amp;oacute;re rozszerzają HttpSessionStateBase z frameworka ASP.NET MVC, ale wystarczy zamienić klasę bazową na HttpSessionState, aby kod działał poprawnie w klasycznych WebFormsach. 

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/Srl7u-cFi5o/Kilka-metod-ulatwiajacych-prace-z-obiektem-sesji-0-133.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/Kilka-metod-ulatwiajacych-prace-z-obiektem-sesji-0-133.aspx</guid>
      <pubDate>Mon, 01 Feb 2010 22:47:49 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/Kilka-metod-ulatwiajacych-prace-z-obiektem-sesji-0-133.aspx</feedburner:origLink></item>
    <item>
      <title>devblogi, devpytania i Telerik</title>
      <description>
Jakiś czas temu w polskim internecie pojawił się serwis &lt;a href="http://devpytania.pl"&gt;devpytania.pl&lt;/a&gt;. Przypadł mi odrazu do gustu, gdyż jest odzwierciedleniem znanego serwisu &lt;a href="http://stackoverflow.com"&gt;stackoverflow.com&lt;/a&gt;. Zarejestrowałem się i często zaglądałem. Znalazło się kilka os&amp;oacute;b co potrzebowali pomocy, więc co wiedziałem to napisałem.


&amp;#160;

&lt;div style="text-align: center"&gt;
&lt;img src="/file.ashx?file=83.jpg" /&gt;
&lt;/div&gt;

&amp;#160;


Jakoś tak samo wyszło, że troszkę tych odpowiedzi się uzbierało co zostało zauważone przez grono tworzące devXXX (devblogi i devpytania) i &lt;a href="http://www.devblogi.pl/2010/03/podziekowania-dla-spoecznosci-devblogow.html"&gt;dostałem upominek w postaci kontrolek Telerika&lt;/a&gt; czego zupełnie się nie spodziewałem.


W tym miejscu chciałbym podziękować szanownemu gronu. :) Prezencik iście zacny. Dzięki :) 

</description>
      <link>http://feedproxy.google.com/~r/dario-g/~3/p5vNLUcp_IE/devblogi-devpytania-i-Telerik-0-134.aspx</link>
      <guid isPermaLink="false">http://dario-g.com/devblogi-devpytania-i-Telerik-0-134.aspx</guid>
      <pubDate>Wed, 10 Mar 2010 23:28:23 GMT</pubDate>
      <author>developer@dario-g.com</author>
    <feedburner:origLink>http://dario-g.com/devblogi-devpytania-i-Telerik-0-134.aspx</feedburner:origLink></item>
  <media:rating>nonadult</media:rating></channel>
</rss>
