VIII 10 2010

Extension metody v jazyce C#

= Extension Methods

Jazyk C# od .NET Frameworku 3.0 umožňuje rozšířit metody nad objektem o takzvané Extension Methods, což jsou metody, které rozšiřují funkcionalitu objektu bez zásahu do kódu objektu.

Ukázkou takové metody může být například metoda, která vrací příznak, zda je hodnota libovolného objektu rovna hodnotě null či nikoliv.

namespace System
{
   public static class ObjectExtensions
   {
      public static bool IsNull(this object o)
      {
         return o == null;
      }
   }
}

if (!myObject.IsNull())
{ … }

 

Extension metoda musí být statická, umístěna ve statické třídě a musí obsahovat první parametr uvozený klíčovým slovem this. Jakmile jsou tyto podmínky splněny, bude daná metoda zobrazena u všech objektů, které odpovídají prvním parametru metody, pokud danou statickou třídu vidí, tj. implementují její namespace.

Příkladem použití Extension Methods jsou například metody používané v LINQu.

Další extension metody je možné nalézt na následující adrese: http://www.extensionmethod.net/Default.aspx .

X 19 2009

Programová změna souboru web.config

= programmatically change web.config

Dnes jsem narazil na nutnost programové změny položek v konfiguračním souboru web.config.

Příklad ukáži na změně v sekci customError. Ukázkový konfigurační soubor je:

   1:  <authenticationmode="Windows" />
   2:          <!--
   3:              The <customErrors> section enables configuration
   4:              of what to do if/when an unhandled error occurs
   5:              during the execution of a request. Specifically,
   6:              it enables developers to configure html error pages
   7:              to be displayed in place of a error stack trace. -->
   8:   
   9:          <customErrorsmode="RemoteOnly" 
  10:              defaultRedirect="GenericErrorPage.htm">
  11:              <errorstatusCode="403"redirect="NoAccess.htm" />
  12:              <errorstatusCode="404"redirect="FileNotFound.htm" />
  13:          </customErrors>
  14:   
  15:      </system.web>

Programově lze poté hodnoty této sekce změnit následujícím způsobem:

   1:  // nacteni sekce
   2:  Configuration configuration = 
   3:       WebConfigurationManager.OpenWebConfiguration("~");
   4:  CustomErrorsSection section = 
   5:       (CustomErrorsSection)configuration.GetSection("system.web/customErrors");
   6:   
   7:  // zmena hodnoty polozky sekce
   8:  section.DefaultRedirect = "SomePage.htm";
   9:   
  10:  //ulozeni konfigurace
  11:  configuration.Save();
VII 24 2009

Otevření souboru v přiřazené aplikace

= Open file in default application

Je-li potřeba otevřít soubor v aplikace, ke které je defaultně přiřazen, lze využít následující konstrukci:

   1: System.Diagnostics.Process.Start(@"C:\poznámky.docx");

kde parametr v závorce je cesta k otevíranému souboru.

Někdy je třeba blíže specifikovat nastavení spouštěné aplikace, např. když ji chceme pouštět maximalizovanou. Toho lze docílit následujícím způsobem:

   1: System.Diagnostics.ProcessStartInfo PSI = new System.Diagnostics.ProcessStartInfo();
   2:  
   3: PSI.FileName = @"C:\poznámky.docx";
   4: PSI.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
   5:  
   6: System.Diagnostics.Process.Start(PSI);

kde vlastnost FileName je cesta k otevíranému souboru a vlastnost WindowStyle jsou parametry, s jakými má dojít ke spuštění defaultní aplikace.

III 12 2009

Odesílání e-mailu - smtp.seznam.cz

Dle nastavení na odeslání e-mailu popsaném na stránkách nápovědy Seznamu je nastavení smtp serveru pro odeslání smtp.seznam.cz (77.75.72.43). Nastavením poštovního klienta (Mozilla Thunderbird, MS Outlook, ...) odesílání funguje. Problém nastává, chcete-li odesílat e-mail např. z Vámi napsané aplikace v jazycích .NET. Odeslání se totiž nezdaří.

Řešení je na můj vkus značně zvláštní. Nenašel jsem způsob, jak přinut aplikaci (konkrétně tento blog - BlogEngine.Net), aby odeslala e-mail prostřednictvím smtp serveru Seznamu. Ale zpátky k řešení: je třeba nastavit jiný server Seznamu, konkrétně se jedná o server mx1.seznam.cz (77.75.72.42). Tento server má jinou IP adresu, ale port a přihlašování je již standardní jako pro smtp server Seznamu, tj. port 25, a vše funguje, jak má. E-maily se posílají :-).

II 25 2009

Rozšíření Anketa pro BlogEngine.Net

= New module for the BlogEngine.Net bloging system - Poll

Aktualizace (28.2.2009)

V rámci soutěže vyhlášené Microsoftem (Soutěž: Udělejte si blog forum nebo wiki, dostanete triko a možná i počítač) jsem se rozhodl vytvořit rozšíření implementující anketu.

První pokus, který jsem sepsal během včerejšího večera, je spíše návrh čekající na nápady či připomínky :). Momentálně je možné vytvořit anketu s možností výběru z 10 odpovědí, přičemž průběh hlasování se zobrazuje jak číselně (počet hlasů k položce), tak i pokus o grafický vzhled. Dále je prováděna kontrola hlasování, tj. z každé IP adresy je možné hlasovat pro danou anketu jen jednou. Toto řešení by chtělo ještě časem vylepšit, jelikož jeden hlasující znepřístupní hlasování ostatním uživatelům schovaným za jednou IP adresou.

V rámci aktualizace a úprav bylo hlasování upraveno tak, že hlasování je voláno pomocí AJAXu a není již třeba reload celé stránky. Také byla opravena možná chyba při současném hlasování několikauživatelů najednou. Nyní je zápis do souboru řízen prostřednictvím zámků.

Administrace ankety je řešena standardně dle návrhu aplikace viz následující obrázek:

anketaEdit

Vlastní anketa může mít následující vzhled:

anketa     anketa2

 

Instalace

Pro instalaci rozšíření Anketa stačí upravit jazykové soubory, případně je přehrát, a přidat do nich jazykové nastavení pro anketu. Dále je třeba v projektu přidat složku do složky widgets s názvem Poll. Do této složky nahrát zdrojové soubory (edit.aspx, edit.aspx.cs, widget.aspx, widget.aspx.cs, Poll.js, PollCallBack.aspx a PollCallBack.aspx.cs) rozšíření. Poslední soubor, který je třeba přehrát je třída PollHelper.cs, kterou je třeba nahrát do složky App_Code a v ní do složky Controls.

Jakmile jsou soubory zdrojů a zdrojové aplikace nahrány a přidány do projektu, stačí celý projekt zkompilovat a uložit na server. Rozšíření se automaticky přidá do nabídky a je připraveno k použití.

Zdrojové soubory je možné stáhnout zde.

PS: za jakékoli náměty či připomínky budu rád, pište je prosím do komentářů