Post con tag ‘ASP.Net’

  • reCAPTCHA, Fermare Lo Spam Leggendo Libri

    Navigando su internet mi sono imbattuto in reCAPTCHA, uno strumento che consente di inserire all’interno del proprio sito un box per verificare che chi scrive un commento o vuole registrarsi ad un servizio online sia effettivamente umano, e non un programma automatico.

    In realtà però reCAPTCHA è qualcosa di più: utilizzando il piccolo controllo, disponibile come plugin per molti linguaggi di programmazione come PHP e ASP.Net e per piattaforme come WordPress e phpBB, è possibile aiutare la digitalizzazione di testi antichi, in particolare quelli di Internet Archive. Infatti nel form di verifica sono presenti due parole da identificare: una delle due è stata letta correttamente da un programma OCR sulla pagina di un libro, mentre l’altra è di interpretazione incerta.

    Esempio di reCAPTCHA

    Identificando correttamente la prima, il software reCAPTCHA riterrà molto probabile che abbiate indovinato anche la seconda. Non appena la parola incerta sarà stata identificata correttamente da un certo numero di persone, questa verrà considerata sicura ed aggiunta al rispettivo elenco.

    Il plugin per ASP.Net, si compone di una libreria da inserire all’interno del proprio progetto. All’interno della libreria è presente un controllo personalizzato che è possibile utilizzare direttamente nelle nostre pagine:

    <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>
    
    <recaptcha:RecaptchaControl
      ID="recaptcha"
      runat="server"
      PublicKey=""
      PrivateKey=""
      />
    

    Continua a leggere »

  • Alcuni Link Interessanti su ASP.Net e LINQ

    11 dicembre 2007 | Sviluppo Web | Nessun Commento.

    Voglio segnalare alcuni articoli che ho trovato molto interessanti.

    • ASP.NET MVC FrameworkParte 1, Parte 2, Parte 3. Scott Guthrie offre una panoramica sull’utilizzo della nuova tecnologia MVC rilasciata come parte di ASP.NET 3.5 Extensions CTP Preview (scaribile da qui). Spero di riuscire fra breve a scrivere qualcosa su questa promettente tecnologia.
    • LINQ to SQLParte 1, Parte 2, Parte 3, Parte 4, Parte 5, Parte 6, Parte 7, Parte 8 e Parte 9. Sempre dal blog di Scott Guthrie ecco una serie di interventi non molto recenti, ma che offrono un’ottima visione di insieme sul linguaggio LINQ applicato a SQL Server.
    • LINQ to Video – 17 video sull’utilizzo di LINQ to SQL.

    Infine vorrei segnalare un progetto che mi era rimasto sconosciuto fino ad oggi: Volta, che si propone di unificare lo sviluppo lato server e client semplificando non poco la vita a noi poveri sviluppatori.

  • Online il mio Primo Articolo su HTML.it

    29 novembre 2007 | Sviluppo Web | Nessun Commento.

    E’ online su HTML.it un mio articolo dedicato a ASP.Net & SQLite che, oltre all’interazione fra le due tecnologie, offre una sostanziosa introduzione al motore di database e alle sue particolarità, soprattutto in confronto ai database tradizionali.

    Penso che verrà presto pubblicato anche un altro articolo che ho scritto sempre per HTML.it, dedicato ancora una volta a SQLite e in particolare alla creazione, spiegata molto dettagliatamente, di un MembershipProvider personalizzato.

  • Cambiare la Stringa di Connessione di un Provider Tramite Codice

    16 novembre 2007 | Sviluppo Web | Nessun Commento.

    Come probabilmente saprete, i provider vengono caricati in memoria, attraverso l’utilizzo di classi statiche, all’avvio dell’applicazione web. Proprio perchè il loro ciclo di vita dipende strettamente da quello dell’applicazione, è impossibile modificarne le proprietà, come ad esempio la stringa di connessione al database.

    Ma perchè doverla modificare? Un esempio potrebbe essere quello che segue.

    Abbiamo la necessità di definire due diverse strighe di connessione, una per l’ambiente di sviluppo e l’altra per quello di produzione. Generalmente esse verranno salvate all’interno del file web.config nella sezione connectionStrings:

    <connectionStrings>
            <!-- Sviluppo -->
            <add name="DebugConnString" connectionString="Data Source=ServerSviluppo;Initial Catalog=MioDatabase;" providerName="System.Data.SqlClient"/>
    
            <!-- Produzione -->
            <add name="ProductionConnString" connectionString="Data Source=ServerProduzione;Initial Catalog=MioDatabase;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    

    E potrebbero essere utilizzate, ad esempio, per un Membership Provider:

    <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="30">
                <providers>
                    <clear />
                    <add
                      name="SqlProvider"
                      type="System.Web.Security.SqlMembershipProvider"
                      connectionStringName="DebugConnString"
                      applicationName="MiaApplicazione"
                      enablePasswordRetrieval="false"
                      enablePasswordReset="true"
                      requiresQuestionAndAnswer="true"
                      requiresUniqueEmail="true"
                      passwordFormat="Hashed" />
                </providers>
    </membership>
    

    Passando da un ambiente all’altro ci troviamo quindi a dover modificare manualmente il file web.config per selezionare la stringa di connessione necessaria, senza pensare ai problemi che potrebbero derivare da una eventuale dimenticanza.
    La soluzione a questi problemi consiste nell’utilizzo della Reflection, che ci consente di andare a modificare le variabili di una classe, anche quando queste sono state dichiarate private. Il codice che segue va aggiunto al file Global.asax:

    <%@ Application Language="C#" %>
    <%@ Import Namespace="System.Reflection" %>
    <%@ Import Namespace="System.Configuration" %>
    
    <script runat="server">
    
        void Application_Start(object sender, EventArgs e)
        {
            // Cerco il provider
            MembershipProvider mp = Membership.Provider;
            Type t = mp.GetType();
    
            // Cerco la variabile privata _sqlConnectionString all'interno dell'istanza
            // del provider
            FieldInfo info = t.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.NonPublic);
    
            // La modifico a seconda di quella che ci serve
            // Soltanto il codice necessario verrà effettivamente compilato
            #if DEBUG
                    // Siamo in sviluppo
                    info.SetValue(mp,
    ConfigurationManager.ConnectionStrings["DebugConnString"].ConnectionString);
            #else
                    // Siamo in produzione
                    info.SetValue(mp,
    ConfigurationManager.ConnectionStrings["ProductionConnString"].ConnectionString);
            #endif
        }
    </script>
    

    Anche se è da considerarsi più un “trucco” che una pratica di programmazione corretta, questo sistema funziona e può tornare utile in molte situazioni.

  • Un Blog con ASP.Net e SQLite, Terza Parte

    27 settembre 2007 | Sviluppo Web | Nessun Commento.
    Questo tutorial è diviso in tre parti distinte:

    Negli interventi precedenti sono stati trattati, dopo una rapida introduzione a SQLite, la creazione del database e della pagina di amministrazione.

    In questo ultimo intervento vedremo, invece, come creare l’ultimo componente del mini-blog: una semplice pagina per visualizzare gli interventi e navigarli per categorie.
    La struttura sarà molto simile a quella della pagina di amministrazione: tramite una MultiView, infatti, caricheremo o una lista degli ultimi dieci interventi, oppure una lista degli interventi appartenenti ad una determinata categoria.

    Scarica il progetto completo!

    Organizziamo la pagina: la colonna di sinistra

    Il layout sarà costituito da due colonne, quella di sinistra conterrà il menu di navigazione e l’altra gli interventi:

    <div style="width:75%;">
         <div style="float: left; width: 25%;"></div>
         <div style="float: right; width: 69%;"></div>
    </div>
    

    Per mostrare la lista delle categorie, sarà sufficiente un controllo Repeater associato ad un SqlDataSource (per la quanto riguarda la creazione della stringa di connessione al database si veda la seconda parte del tutorial):

    <div style="float: left; width: 25%;">
        <span style="font-weight: bold;">Categorie</span>
        <asp:Repeater ID="Categorie" runat="server" DataSourceID="Categorie_Source">
            <HeaderTemplate>
                <ul>
            </HeaderTemplate>
            <ItemTemplate>
                <li>
                    <a href="default.aspx?categoria=<%# (string)Eval("NomeCategoria") %>"
                            title="<%# (string)Eval("NomeCategoria") %>">
                          <%# (string)Eval("NomeCategoria") %></a>
                </li>
            </ItemTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
        </asp:Repeater>
    </div>
    <asp:SqlDataSource ID="Categorie_Source" runat="server" ProviderName="System.Data.SQLite"
        ConnectionString="<%$ ConnectionStrings:ExampleBlogConnString %>"
        SelectCommand="SELECT * FROM Categorie">
    </asp:SqlDataSource>
    

    Come potete vedere il Repeater crea una lista non ordinata di elementi che nel nostro caso saranno i nomi delle categorie, con un link che passa come parametro nella query string il nome della categoria. Questo viene recuperato nell’evento onLoad della pagina e la vista attiva all’interno del MultiView (che creeremo fra poche righe) modificata di conseguenza:

    protected void Page_Load(object sender, EventArgs e)
    {
       if (!this.IsPostBack)
          if (!string.IsNullOrEmpty(Request.QueryString["categoria"]))
          {
             MultiView1.ActiveViewIndex = 1;
             NomeCategoria.Text = Request.QueryString["categoria"];
          }
          else
             MultiView1.ActiveViewIndex = 0;
    }
    

    La colonna di destra: mostriamo gli interventi

    Ecco qui, per concludere il controllo MultiView incaricato di mostrare gli interventi. Il codice mi sembra abbastanza semplice da non richiedere ulteriore analisi, per ogni dubbio lasciate un commento!

    <asp:MultiView id="MultiView1" runat="server" activeviewindex="0">
        <asp:View ID="ListaInterventi" runat="server">
            <h1>Ultimi Interventi</h1>
            <asp:Repeater ID="Interventi" runat="server" DataSourceID="Interventi_Source">
                <ItemTemplate>
                    <div>
                        <h2><%# (string)Eval("Titolo") %></h2>
                        <div style="font-weight: bold;">
                              <%# ((DateTime)Eval("Data")).ToString("dd/MM/yyyy hh:mm") %>,
                              <%# (string)Eval("NomeCategoria") %>
                        </div>
                        <div>
                            <%# (string)Eval("Testo") %>
                        </div>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
    
            <asp:SqlDataSource ID="Interventi_Source" runat="server" ProviderName="System.Data.SQLite"
                ConnectionString="<%$ ConnectionStrings:ExampleBlogConnString %>"
                SelectCommand="SELECT * FROM Interventi INNER JOIN Categorie ON Interventi.Categoria = Categorie.IDCategoria ORDER BY Data DESC LIMIT 10">
            </asp:SqlDataSource>
        </asp:View>
    
        <asp:View ID="InterventiPerCategoria" runat="server">
            <h1>
                Categoria:
                <asp:Literal ID="NomeCategoria" runat="server" />
            </h1>
            <asp:Repeater ID="InterventiCat" runat="server" DataSourceID="InterventiCat_Source">
                <ItemTemplate>
                    <div>
                        <h2><%# (string)Eval("Titolo") %></h2>
                        <div style="font-weight: bold;">
                            <%# ((DateTime)Eval("Data")).ToString() %>
                            ,
                            <%# (string)Eval("NomeCategoria") %>
                        </div>
                        <div>
                            <%# (string)Eval("Testo") %></div>
                        </div>
                </ItemTemplate>
            </asp:Repeater>
    
            <asp:SqlDataSource ID="InterventiCat_Source" runat="server" ProviderName="System.Data.SQLite"
                ConnectionString="<%$ ConnectionStrings:ExampleBlogConnString %>"
                SelectCommand="SELECT * FROM Interventi INNER JOIN Categorie ON Interventi.Categoria = Categorie.IDCategoria WHERE NomeCategoria = @NomeCategoria">
                <SelectParameters>
                    <asp:QueryStringParameter Name="@NomeCategoria" Type="string"
                            QueryStringField="categoria" />
                </SelectParameters>
            </asp:SqlDataSource>
        </asp:View>
    </asp:MultiView>
    

    Si conclude così questo piccolo tutorial realizzato principalmente per mostrare le potenzialità di SQLite e del provider per ADO.Net System.Data.Sqlite.

    Scarica il progetto completo!

  • Risolvere l’Errore “Could not find control ‘xxx’ in ControlParameter ‘xxx’”

    11 settembre 2007 | Sviluppo Web | Nessun Commento.

    Prendiamo, per esempio, questo codice:

    <asp:DetailsView ID="DetailsView1" runat="server"
    AutoGenerateRows="false" DataSourceID="SqlDataSource1">
       <Fields>
          <asp:BoundField DataField="ID" />
          <asp:TemplateField>
             <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server"
                   Text='<%# (string)Eval("Nome") %>' />
             </EditItemTemplate>
           </asp:TemplateField>
       </Fields>
    </asp:DetailsView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
    SelectCommand="SELECT ID, Nome FROM TabellaDiProva WHERE ID = @ID"
    UpdateCommand="UPDATE TabellaDiProva SET Nome = @Nome WHERE ID = @ID">
       <SelectParameters>
          <asp:QueryStringParameter Name="ID"
             QueryStringField="id" />
       </SelectParameters>
       <UpdateParameters>
          <asp:QueryStringParameter Name="ID"
             QueryStringField="id" />
          <asp:ControlParameter Name="Nome"
             ControlID="TextBox1" />
       </UpdateParameters>
     </asp:SqlDataSource>
    

    Niente di eccezionale, un controllo DetailsView con un SqlDataSource associato. Questo codice però vi restituirà il seguente errore: "Could not find control ‘TextBox1′ in ControlParameter ‘Nome’.".
    Continua a leggere »

  • Un Blog con ASP.Net e SQLite, Prima Parte

    22 agosto 2007 | Sviluppo Web | Nessun Commento.

    Questo tutorial è diviso in tre parti distinte:

    SQLite (http://www.sqlite.org) è un motore di database open source che, sebbene poco conosciuto e spesso sottovalutato, vanta alcune caratteristiche uniche:

    • il database è interamente contenuto in un singolo file e non richiede quindi alcuna installazione, oltre ad essere indipendente dal sistema operativo utilizzato. Per chi ha il proprio sito in hosting è una scelta economica e di immediata realizzazione;
    • è più veloce di altri database (ad es. MySql);
    • sono disponibili implementazioni per diversi linguaggi tra cui C, PHP e ASP.Net.

    In particolare per ASP.Net mi sono trovato molto bene con la libreria System.Data.SQLite (open source anch’essa e reperibile qui: http://sqlite.phxsoftware.com). Questa libreria implementa completamente il modello dati di ADO.Net e fornisce supporto anche all’interno di Visual Studio (o Visual Web Developer Express, che utilizzerò in questi interventi) in fase di Design.

    Il progetto di esempio che realizzeremo è molto semplice e si compone di due pagine: default.aspx, che mostra gli interventi, e admin.aspx, che ne permette invece l’inserimento.
    Continua a leggere »