Deníček Jakuba "Chrastyho" Kottnauera

Developer & IT Enthusiasist 
Tagováno

asp.net

 

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]

Nový seriál o ASP.NET MVC

Od příštího pondělí (3. 8. 2009) bude na serveru Programujte.com vycházet nový seriál o technologii ASP.NET MVC. Jedná se o volný překlad fantastického tutoriálu pro tuto technologii. Jakého? To se nechte překvapit :-)

Bude mít zhruba 15 dílů, budou vycházet každé tři, čtyři dny. Snad mi tenhle harmonogram moc nenaruší uvolnění Aurory, která by měla být začátkem školního roku (i když je pravda, že není jisté jakého školního roku :D). První díl bude jen úvodní, seriál jako takový začne až 7. srpna.

Loading zmínek Retweet
Tagováno »   ASP.NET   články  

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]

Potvrzovací okénko v ASP.NET

Pokud potřebujete v ASP.NET potvrdit od uživatele nějakou akci, je jednou z možností vyvolání potvrzovacího okénka (jako je například ve WinForms/WPF MessageBox, ten ale v ASP.NET nenajdeme). Takový problém se dá elegantně vyřešit kouskem JavaScriptu. Pokud pro Button použijete kód, který uvidíte níže, vyskočí na uživatele při kliknutí potvrzovací okénku a handler eventu OnClick se zavolá jen tehdy, pokud uživatel klikne na Ano/OK – nemusíte se tedy starat o žádné podmínky co udělat, když uživatel dá Ne, a tak dále.

Teď tedy slíbený kód:

<asp:Button ID="DeleteBtn" OnClick="DeleteBtn_Click" OnClientClick="return confirm('Jste si jistý, že chcete položku smazat?');" Text="Delete" Width="100" Height="40" runat="server" />

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

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]