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: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>
<% } %>
Komentáře [0]
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.Komentáře [0]
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");
Komentáře [3]
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:
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!
Komentáře [0]
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.
Komentáře [0]
Č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; }
}
}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;
Komentáře [0]
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
Komentáře [0]
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>
Komentáře [0]
Možná jste někdy potřebovali vyplnit nějaký TextBox určitým počtem znaků, který zadal uživatel, nebo se může nějak dynamicky (situaci si kdy k tomu může dojít nechám vaší fantazii, tohle je jen příklad, jak to vyřešit v .NET). Jak byste to vyřešili v “normálním” jazyku? Desetkrát projít for cyklem a v každé iteraci přidat hvězdičku, pokud uživatel řekne, že chce deset hvězdiček? Ano, takhle by se to dalo udělat ve většině jazycích, ale jazyky z .NET můžou využít konstruktor třídy String, který přijímá parametr typu string a číslo udávající, kolikrát se má zadaný string vypsat. Pokud tedy chcete naplnit TextBox deseti hvězdičkami, docílíte toho takto:
tb1.Text = new String('*', 10);
Komentáře [0]
Komentáře [0]