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>
<% } %>
Komentáře [0]