Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[Spring.NET #27] Spring.Core, Validation Framework e ASP.NET

In questo post affronteremo l'integrazione del Validation Framework di Spring.NET con le WebForm di ASP.NET. L'integrazione di Spring.NET con ASP.NET è molto ampia e non tocca solo il discorso della validazione, però in questo post mi limiterò su questo argomento.

Fatta questa premessa cominciamo creando in Visual Studio un nuovo progetto ASP.NET Web Application, aggiungiamo le classi Person, AnddressInfo utilizzate nei post precedenti. Facciamo uguale con il file di risorsa Message.resx (introdotto in questo post), aggiungendolo nella directory App_GlobalResources. Eliminiamo Default.aspx ed aggiungiamo le pagine PersonEdit.aspx e PersonValid.aspx, referenziamo gli assembly Spring.Core, Spring.Web, antlr.runtime, Common.Logging ed in fine aggiungiamo una cartella Images con un immagine da visualizzare nella pagina web accanto ad i controlli non validi. Il risultato finale sà a quello visualizzato nell'immagine laterale.terminata la parte di setup della solution procediamo con la modifica delle pagine aspx. Cominciamo con la pagina PersonEdit.aspx, aggiungiamo una serie di controlli ASP.NET per inserire i dati di Person, ed i controlli Spring.NET per il rendering dei messaggi e dell'immagine di errore: post_spring_web_01
   1: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PersonEdit.aspx.cs" Inherits="SpringSeries.Core.ValidationWebForm.PersonEdit" %>
   2: <html xmlns="http://www.w3.org/1999/xhtml" >
   3: <head runat="server">
   4:     <title>Spring.NET Validation Framework Test</title>
   5:     <style type="text/css">
   6:         .validationError
   7:         {
   8:             font-size: 80%;
   9:             color: #DC143C;
  10:         }
  11:     </style>
  12: </head>
  13: <body>
  14:     <h1>Spring.NET Validation Framework Test</h1>
  15:     <form id="form1" runat="server">
  16:     <table>
  17:         <tr><td><asp:Label ID="Label1" runat="server" Text="First Name:"></asp:Label></td>
  18:             <td>
  19:                 <asp:TextBox  ID="txtFirstname" runat="server"></asp:TextBox>        
  20:                 <spring:ValidationError id="FirstNameMessage" runat="server" />
  21:             </td></tr>
  22:         <tr><td><asp:Label ID="Label2" runat="server" Text="Last Name:"></asp:Label></td>
  23:             <td>
  24:                 <asp:TextBox  ID="txtLastName" runat="server"></asp:TextBox>        
  25:             </td></tr>
  26:         <tr><td><asp:Label ID="Label3" runat="server" Text="Date Of Birth:"></asp:Label></td>
  27:             <td>
  28:                 <asp:Calendar ID="clDateOfBirth" runat="server" ></asp:Calendar>
  29:                 <spring:ValidationError id="DateOfBirthMessage" runat="server" />
  30:             </td></tr>
  31:         <tr><td><asp:Label ID="Label4" runat="server" Text="Address:"></asp:Label></td>
  32:             <td>
  33:                 <asp:TextBox  ID="txtAddress" runat="server"></asp:TextBox>        
  34:             </td></tr>
  35:         <tr><td><asp:Label ID="Label5" runat="server" Text="City:"></asp:Label></td>
  36:             <td>
  37:                 <asp:TextBox  ID="txtCity" runat="server"></asp:TextBox>
  38:                 <spring:ValidationError id="CityMessage" runat="server" />        
  39:             </td></tr>
  40:         <tr><td><asp:Label ID="Label6" runat="server" Text="PostalCode:"></asp:Label></td>
  41:             <td>
  42:                 <asp:TextBox  ID="txtPostalCode" runat="server"></asp:TextBox>        
  43:                 <spring:ValidationError id="PostalCodeMessage" runat="server" />
  44:             </td></tr>   
  45:         <tr><td></td>
  46:             <td>
  47:                 <spring:ValidationSummary ID="validationSummary" runat="server" />
  48:             </td></tr>  
  49:         <tr><td></td>
  50:             <td>
  51:                 <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
  52:             </td></tr>   
  53:     </table>        
  54:     </form>
  55: </body>
  56: </html>

leggendo il codice di markup notiamo l'utilizzo di due controlli forniti da Spring.NET:

  • ValidationSummary: Questo controllo viene utilizzato al posto di quello standard di ASP.NET e serve a visualizzare, in maniera ragruppata, tutti i messagi di errore generati dal validation framework.
  • ValidationError: Questo controllo viene utilizzato per visualizzare un errore di validazione a livello di elemento della pagina web.

per entrambi i controlli possiamo decidere la modalità di rendering. Quelle già fornite built-in sono:

  • SpanValidationErrorsRenderer: Questa implementazione renderizza i messaggi di errore racchiusi in un elemento span.
  • DivValidationErrorsRenderer: Questa implementazione renderizza i messaggi di errore racchiusi in un elemendo div.
  • IconValidationErrorsRenderer: Questa implementazione visualizza un immagine di errore con un tooltip per visualizzare il messaggio di errore.

per implementare un nostro particolare ValidationErrorsRenderer basterà creare una classe che implementi la relatia interfaccia IValidationErrorsRenderer. La configurazione di questi controlli verrà trattata più tardi. Continuiamo modificando la pagina PersonValid.aspx, in questo caso non facciamo altro che visualizzare un banale messaggio di avvenuta validatazione.

   1: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PersonValid.aspx.cs" Inherits="SpringSeries.Core.ValidationWebForm.PersonValid" %>
   2: <html xmlns="http://www.w3.org/1999/xhtml" >
   3: <head runat="server">
   4:     <title>Validazione Effettuata Correttamente</title>
   5: </head>
   6: <body>
   7:     <h1>Person is valid!!</h1>
   8: </body>
   9: </html>

Spostiamoci nel code-behind della pagina PersonEdit.aspx, i passi da fare sono molto semplici, ereditare la pagina da Spring.Web.Page anzichè System.Web.Page, aggingere un field di tipo Spring.Validation.IValidator, esporlo tramite una setter property (questo permetterà al motore di IoC di iniettare il concreto validator all'interno della pagina) ed in fine effettuare la validazione tramite il metodo Validate della calsse base Page. Questo metodo ha due parametri, l'oggetto da validare (validationContext) ed il validator da utilizzare (validators). Validate verrà invocato nel metodo  abbinato all'evento click del pulsante Save, dopo aver impostato i dati di Person, in seguito se l'istanza è valida faremo un redirect alla pagina PersonValid.aspx, altrimenti verranno automaticamente visualizzati i messaggi e le icone di errore. Il codice risulterà così:

   1: using System;
   2: using System.Web.UI;
   3: using Spring.Web.UI;
   4: using System.Reflection;
   5:  
   6: namespace SpringSeries.Core.ValidationWebForm{
   7:     public partial class PersonEdit : Spring.Web.UI.Page{
   8:         private Person _person;
   9:         private Spring.Validation.IValidator _personValidator;
  10:  
  11:         public Spring.Validation.IValidator PersonValidator{
  12:             set { _personValidator = value; }
  13:         }
  14:  
  15:         protected void btnSave_Click(object sender, EventArgs e){
  16:             _person = new Person(1);
  17:             _person.FirstName = txtFirstname.Text;
  18:             _person.LastName = txtLastName.Text;
  19:             _person.DateOfBirth = clDateOfBirth.SelectedDate;
  20:             _person.AddressInfo.Address = txtAddress.Text;
  21:             _person.AddressInfo.City = txtCity.Text;
  22:             _person.AddressInfo.PostalCode = txtPostalCode.Text;
  23:  
  24:             if (Validate(_person, _personValidator))
  25:             {
  26:                 Response.Redirect("PersonValid.aspx");
  27:             }            
  28:         }
  29:     }
  30: }

Ok, la pagina di validazione è pronta non ci resta che configurare l'ambiente nel file Web.config. Cominciamo aggiungendo nella sezione <system.web> l' HttpModule e l' HttpHandler necessari per l'abilitazione del Web Framework di Spring.NET, oltre a questi inseriamo una direttiva <pages> per la gestione di controlli taggati spring:

<system.web>
  <compilation debug="true" />
  <authentication mode="Windows" />
  <pages>
    <controls>
      <add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
    </controls>
  </pages>
  <httpModules>
    <add name="SpringModule" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
  </httpModules>
  <httpHandlers>
    <add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
  </httpHandlers>
</system.web>

procediamo configurando l'ApplicationContext, inserendo nel tag objects, il MessageSource e le impostazioni di DI per la pagina PersonEdit.aspx :

<object id="messageSource" type="Spring.Context.Support.ResourceSetMessageSource, Spring.Core">
  <property name="ResourceManagers">
    <list>
      <value>Resources.Messages, App_GlobalResources</value>
    </list>
  </property>
  <property name="UseCodeAsDefaultMessage" value="true" />
</object>      
<object type="PersonEdit.aspx">
  <property name="PersonValidator" ref="personValidator" />
</object>

adesso tocca alle impostazioni di rendering per i controlli ValidationSummary e ValidationError, sempre tramite la DI, utilizzando rispettivamente un DivValidationErrorsRenderer (inidcando la CssClass da utilizzare) ed un IconValidationErrorsRenderer (indicando l'immagine da utilizzare) :

<object id="Spring.Web.UI.Controls.ValidationError" abstract="true">
  <property name="Renderer">
    <object type="Spring.Web.UI.Validation.IconValidationErrorsRenderer, Spring.Web">
      <property name="IconSrc" value="validation-error.gif"/>
    </object>
  </property>
</object>
<object id="Spring.Web.UI.Controls.ValidationSummary" abstract="true">
  <property name="Renderer">
    <object type="Spring.Web.UI.Validation.DivValidationErrorsRenderer, Spring.Web">
      <property name="CssClass" value="validationError"/>
    </object>
  </property>
</object>

ultima cosa da configurare sono le solite regole di validazione della classe Person utilizzati nel post precedente. Non ci resta che caricare la pagine nel Browser e cliccare il button Save per vedere il risultato dei due ValidationErrorsRenderer :

post_spring_web_02 post_spring_web_03
Technorati Tag:

Print | posted on sabato 26 gennaio 2008 22:24 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET