Deníček Jakuba "Chrastyho" Kottnauera

Developer & IT Enthusiasist 
Tagováno

programming

 

Čtení XML pomocí třídy XDocument a ignorování vložených HTML tagů

Dnes jsem zapracoval na jednoduchém vylepšení své homepage - popisy, odkazy na obrázky, atd. jednotlivých projektů a jejich anglické a české verze jsou načítány z XML souboru. Během práce na této změně jsem opět narazil na jednu maličkou nepříjemnost, která souvisí s třídou XDocument - pokud mám nějaký text například uvnitř elementu "Text" a tento text obsahuje nějaké HTML značky, ať už je to a, b nebo div, tak se tyto značky nezobrazí/neaplikují. Pro upřesnění malá ukázka:

  <project>
    <Image>css/projects/pdf.png</Image>
    <Url>http://chrasty.cz/down/C_threading.pdf</Url>
     <Czech>
      <Header>Překlad Threading in C# (J. Albahari)</Header>
      <Text>
        <p>
          V roce jsem 2008 jsem přeložil do českého jazyka e-book od
          Josepha Albahariho
           o vláknech v C#.
        </p>
        <p>
          Překlad jsem vydal jak ve formě
          14-ti článků na Programujte.com,
           tak i jako samostatné přibližně 80-ti stránkové PDF, které najdete ke stažení
          na mém webu, i
           na webu Josepha Albahariho.
         </p>
      </Text>
    </Czech>
...

Tříd pro práci s XML existuje celá řada a určitě existuje nějaká, ve které se dá přečtení vnitřních tagů nastavit, ale v případě třídy XDocument tomu tak není. Co tedy s tím? Můžeme použít jednu z vlastností .NET frameworku 3.5, a to konkrétně extension methods. Taková jednoduchá rozšiřující metoda, která se aplikuje na instanci třídy XElementy a umožňuje přesně to, o čem zde mluvím, může vypadat například takto:

public static string InnerXml(this XElement element)
{
    StringBuilder innerXml = new StringBuilder();

    foreach (XNode node in element.Nodes())
    {
        innerXml.Append(node.ToString());
     }
    return innerXml.ToString();
}

Již nám nic nebrání přečíst vnitřek například elementu Text rodiče Czech nějakým podobným kódem:

// proměnná "x" zde zastupuje úroveň elementu "project", viz XML kód výše
 p.Text = x.Element("Czech").Element("Text").InnerXml();

Loading zmínek Retweet
Tagováno »   c#   extension methods   programming   xml  

Komentáře [0]

Už se to blíží

Již brzy ve vašich prohlížečích.

Loading zmínek Retweet
Tagováno »   photolum   programming  

Komentáře [0]

Client-side validace a LINQ to SQL/Entities v ASP.NET MVC 2

ASP.NET MVC 2.0 přijde s jednou velmi hezkou novinkou, a to vestavěnou podporou pro validace na straně klienta pomocí jQuery. Snadněji by to už udělat nešlo: pokud máme například formulář na vytvoření nového komentáře, stačí si vytvořit třídu Comment s vlastnostmi reprezentujícími jednotlivá pole formuláře a odekorovat je patřičnými atributy. Komplikace nastává v případě, kdy máme tuto třídu už automaticky vytvořenou, například vygenerovanou pomocí LINQ to SQL podle databáze. Řešením by bylo něco jako "partial properties", nic takového ale v .NET frameworku nenajdeme. Takže co s tím?

Budeme potřebovat dvě třídy:

  • partial class Comment - bude rozšiřovat třídu Comment vygenerovanou LINQ to SQL
  • class CommentMetaData - zde vypíšeme a odekorujeme vlastnosti, které chceme validovat

Jediný rozdíl je tedy v tom, že místo toho, abychom samotné vlastnosti nadefinovali jako "partial" (což nejde), uvedeme je v jiné třídy a na ni odkážeme ze třídy Comment pomocí atributu MetadataType. Zdrojáček:

 [MetadataType(typeof(CommentMetaData))]
public partial class Comment
{
}

public class CommentMetaData
{
    [Required(ErrorMessage = "Jméno je povinné")]
    public string Author { get; set; }
 
    [Required(ErrorMessage = "Text příspěvku je povinný")]
    public string Text { get; set; }

    [Required(ErrorMessage = "E-mail je povinný")]
    [RegularExpression(@"[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}", ErrorMessage = "E-mail je v nesprávném tvaru!")]
     public string Email { get; set; }
}

Teď už stačí ve View obsahující formulář pro přidání komentářů povolit validace na straně klienta pomocí jedné helper metody (pozor, je nutné tuto metodu zavolat před form tagem (nebo zavoláním Html.BeginForm()), poprvé jsem to přehlídl a pak hodinu přemýšlel nad tím, proč validace nefungují :-)). Kromě toho ještě musíme přidat reference na tři .js soubory, které defaultně nalezneme ve složce Scripts uvnitř MVC projektu.

Ukázkový kód View šablony s podporou jQuery validací:

<script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script>
 <script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript"></script>  
  
<% Html.EnableClientValidation(); %>

<% using (Html.BeginForm()) {%>
     <fieldset>
        <legend>Přidat komentář</legend>

        <p>
            <label for="Author">Jméno:</label>
            <%= Html.EditorFor(author=>author.Author)%>
             <%= Html.ValidationMessage("Author", "*") %>       
        </p>

        <p>
            <label for="Email">E-mail:</label>
            <%= Html.TextBox("Email") %>
             <%= Html.ValidationMessage("Email", "*") %>
        </p>
        <p>
            <label for="Web">Web:</label>
            <%= Html.TextBox("Web") %>
             <%= Html.ValidationMessage("Web", "*") %>
        </p>
        
        <p>
            <label for="Text">Text:</label>
            <%= Html.TextArea("Text", null, 10, 40, null)%>
             <%= Html.ValidationMessage("Text", "*") %>
        </p>
        
        <p>
            <input type="submit" value="Odeslat komentář" />
         </p>
    </fieldset>

<% } %>

Loading zmínek Retweet
Tagováno »   asp.net   entities   jquery   mvc   programming   sql   web. linq  

Komentáře [0]

Silverlight a práce s databází

Tento článek měl být původně jen krátkým příspěvkem na blog, i proto to odlehčené pojetí a epická šíře zezačátku, ale rozrostl se v téměř sedmistránkový útvar, a proto jsem se rozhodl ho publikovat na Programujte.com. Zde tedy jen perex a odkaz na celý článek:

V centru dnešního softwarového světa stojí databáze, snad by ani nebylo troufalé říci, že většina větších aplikací nějakou tu databázi využívá. Vytvořit takovou „database-driven“ aplikaci v Silverlightu se může, zejména v porovnání s technologiemi jako ASP.NET, zdát zbytečně komplikované. Účelem tohoto článku je dokázat opak – ukázat čtenářům, že je to ve skutečnosti velmi snadné.

Celý článek je zde.

Loading zmínek Retweet
Tagováno »   programming   silverlight   wcf   články  

Komentáře [0]

Zvýraznění zdrojáků v Posterous

E-mailový redakční systém Posterous, který používám na tomto blogu, má takové omezení. Tím je nepodpora plug-inů, vše, co Posterous umí, musí být implementováno přímo jeho vývojáři. Ač to tak na první pohled vypadat nemusí, Posterous zvýrazňování zdrojového kódu umí.

Je to  velmi snadné, stačí jen obalit kód do tagů code (v hranatých závorkách). Navíc můžete, pomocí atributu lang, specifikovat i jazyk pro zvýraznění syntaxe. Na výběr máte z hodnot 'cpp', 'c', 'c++', 'c#', 'c-sharp', 'csharp', 'css', 'delphi', 'pascal', 'java', 'js', 'jscript', 'javascript', 'php', 'py', 'python', 'ruby', 'rails', 'ror', 'sql', 'vb', 'vb.net', 'xml', 'xhtml', 'xslt', 'html', 'xhtml'.

Výsledku jste si už mohli všimnout v několika článcích na tomto blogu, ale ještě na ukázku:

// Volání jedné metody
MessageBox.Show("Hello World");

Loading zmínek Retweet
Tagováno »   posterous   programming  

Komentáře [3]

IT podcasty, které se vyplatí sledovat

Jakožto maximálně spokojený majitel přehrávače Microsoft Zune 80GB ho využívám nejen k přehrávání hudby, ale za pomoci Zune software i ke stahování různých zajímavých podcastů (zvukové stopy a videa).

Dalo by se říct, že podcast je vlastně “multimediální RSS” – v Zune software či jiné aplikaci (podcasty podporují i iPody, existují i stahovátka na desktop,…) zadáte adresu RSS feedu a daná aplikace vám pak nový obsah automaticky stahuje. Osobně stahuju šest podcastů ze světa techniky:

  • .NET Rocks! – Má už něco přes 400 dílů, každý v průměru cca 45 minut. Výborná kvalita, spousta zajímavých informací, interviews, …
  • ASP.NET Podcast – Informace ohledně ASP.NET
  • StackOverflow Podcast – Kdo nezná StackOverflow.com, jako by nežil :-)
  • Hanselminutes – A další výborná věc, podcast Scotta Hanselmana, známého .NET vývojáře. Opět spousty informací o nejnovějších technologiích, tipy a podobné věci
  • Channel 9 – Novinky ze světa MS technologií
  • Sparkling Client – zaměřené jen na Silverlight a další RIA technologie

Možná, že tento výčet někomu přijde na jedno brdo, ale mně vyhovuje. Pokud hledáte nějaké technické podcasty, doporučuju tyto!

Loading zmínek Retweet
Tagováno »   podcasts   programming   zábava   zune  

Komentáře [0]

Výběr výborných témat na StackOverflow.com

O tomto serveru málokdo z programujících lidí nikdy neslyšel; StackOverflow.com je programátorská poradna s velkou uživatelskou základnou. Kromě samých seriózních a závažných věcí (:-)) se zde občas objeví i témata vtipnějšího charakteru, jako například “Jaké špatné návyky máte kvůli programování”. A tady je seznam mých oblíbených témat, doporučuju si je někdy během nudných víkendových večerů pročíst.

What code would you have on your wedding cake?

Programmer Jokes — what’s your best one?

Great programming quotes

How can you tell if a person is a programmer?

What is your favorite “programmer” t-shirt?

Jon Skeet Facts?

What real life bad habits has programming given you?

Loading zmínek Retweet
Tagováno »   programming   stackoverflow  

Komentáře [0]

Vytváření vlastních sekcí ve web.configu

Častým způsobem ukládání nastavení webových aplikací v ASP.NET je ukládání do web.configu. V základu máme možnost přidávat jen elementy do sekce <appSettings>. Takový postup je OK, dokud nám stačí ukládat jen jednoduché věci ve tvaru klíč-hodnota. Kousek XML uchovávající například název stránky může vypadat následovně:

<appSettings>
    <add key="PageTitle" value="Moje stránka" />
</appSettings>

Často taková věc stačí, někdy ale naopak chceme ukládat i složitější věci, teď mě napadají třeba detailní informace k připojení k nějaké vzdálené službě. V takové situaci by se nám určitě víc než X na první pohled nesouvisejících hodnot v <appSettings> hodilo moci uložit takový kód:

<serviceConnection available="true" timeout="00:01:00" url="http://localhost/MyService" />

ASP.NET naštěstí umožňuje rozšiřovat web.config. Dělá se to tak, že pro každý element, který chceme přidat (v našem případě se jmenuje <serviceConnection>), vytvoříme třídu odvozenou od ConfigurationSection, která bude mít sadu public vlastností odpovídajících požadovaným atributům (pro nás tedy atributy “available”, “timeout” a “url”). K tomu navíc musí mít každá z vlastností nad sebou atribut (teď myslím .NETovský atribut, ne ten XML) ConfigurationProperty, který určuje název atributu v XML, to, zda je povinný, a případně jeho výchozí hodnotu. Kód opět řekne víc, než tisíc slov:

public class ServiceConnection : ConfigurationSection
{
    [ConfigurationPorperty("available", IsRequired = false, DefaultValue = true)]
    public bool Available
     {
        get { return (bool)base["available"]; }
        set { base["available"] = value; }
    }

    [ConfigurationPorperty("timeout", IsRequired = true)]
    public TimeSpan Timeout
     {
        get { return (TimeSpan)base["timeout"]; }
        set { base["timeout"] = value; }
    }

    [ConfigurationPorperty("url", IsRequired = true)]
    public string Url
     {
        get { return (string)base["url"]; }
        set { base["url"] = value; }
    }
}

Registrace sekce do web.config

Pro zaregistrování naší nové sekce do web.configu stačí upravit sekci <configSections>. Tento krok je velmi důležitý, protože kdybyste se pokusili přidat do web.configu nezaregistrovanou sekci/element, tak při spuštění aplikace dojde k chybě. Registraci provedete jako v následujícím kódu:

<configSections>
    <section name="serviceConnection" type="ServiceConnection" />
</configSections>

Myslím, že není moc co vysvětlovat – atribut “name” definuje název elementu a atribut "type” odkazuje na naší C# třídu.

A máme hotovo, data z naší nové sekce vytáhneme, jako by to byla jakákoliv standardní sekce, tedy takto:

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
 ServiceConnection sc = (ServiceConnection)config.GetSection("serviceConnection");
// Hodnotu atributu url získáte pomocí sc.url;

Loading zmínek Retweet
Tagováno »   asp.net   C#   programming  

Komentáře [0]

První seriál o MS Expression Blend na českém netu!

Dnes jsme, společně s Péťou "plasmem" Láslem vydali úvodní díl k prvnímu seriálu o Blendu na českém internetu. Sám už mám připravených několik zajímavých témat, plasmo taky, takže seriálu vyjde na 100% hezkých několik dílů. Teď ochutnávka a nakonec odkaz na článek:

V době psaní článku existují tři verze Blendu, jedna je prodávaná jako součást balíku Microsoft Expression (build 1083), druhá se jmenuje Blend 2, do prodeje vyšla jako součást Expression Studio 2, a třetí je Preview verze z června 2008 (Blend 2.5 June 2008 Preview). Třetí jmenovaná vám bude legálně fungovat i bez jakéhokoliv sériového čísla do ledna 2009, i to je jeden z důvodů, proč nás bude seriálem provázet tato verze. Důvod číslo dva je i podpora Silverlight 2 beta 2, ke kterému se určitě v budoucnu dostaneme. Sám používám tuto verzi už od chvíle, co se objevila na Internetu, je naprosto stabilní a není nijak omezená ve funkčnosti. Než se podíváme na samotný Blend, ještě zmíním, že celá aplikace je udělaná pomocí WPF (Windows Presentation Foundation).

Celý článek najdete na Programujte.com

Loading zmínek Retweet
Tagováno »   Expression Studio   programming   články  

Komentáře [0]

Numeric-only TextBox v ASP.NET bez JavaScriptu

Asi profláklá věc, ale nevadí.

Tak tedy - máte TextBox a chcete co nejjednodušeji zajistit, aby do něj uživatel mohl napsat jen čísla? Mým oblíbeným způsobem je použití validátoru CompareValidator, který dokáže porovnat obsah zadaného TextBoxu proti nějakému datovému typu. Pokud chcete celá čísla, porovnáte obsah s Integerem atd.:

</span><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="Jen čísla" Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>

Loading zmínek Retweet
Tagováno »   asp.net   C#   programming  

Komentáře [0]