Archivio per settembre, 2007

  • 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!

  • Inviare Email Tramite ASP

    12 settembre 2007 | Sviluppo Web | Nessun Commento.

    A seconda del sistema operativo utilizzato, ASP mette a disposizione dello sviluppatore due oggetti per l’invio di email. Fino a Windows NT, infatti, l’oggetto predefinito è CDONTS, mentre da Windows 2000 in poi è obbligatorio utilizzare CDO.

    Di seguito due esempi che mostrano l’uso di entrambi gli oggetti.

    CDONTS

    <%
    'Creo l'oggetto
    Set objCDONTS = Server.CreateObject("CDONTS.NewMail")
    
    objCDONTS.From = "mittente@tuamail.it" 'Mittente
    objCDONTS.To = "destinatario@suamail.it" 'Destinatario
    objCDONTS.Subject = "Oggetto della email" 'Oggetto
    objCDONTS.Body = "Testo della email" 'Testo
    
    objCDONTS.Send 'Invio del messaggio
    
    'Pulizia
    Set objCDONTS = Nothing
    %>
    

    CDO

    'Creo l'oggetto
    Set objCDO = Server.CreateObject("CDO.Message")
    
    objCDO.From = "mittente@tuamail.it" 'Mittente
    objCDO.To = "destinatario@suamail.it" 'Destinatario
    objCDO.Subject = "Oggetto della email" 'Oggetto
    objCDO.TextBody = "Testo della email" 'Testo
    
    objCDO.Send 'Invio del messaggio
    
    'Pulizia
    Set objCDONTS = Nothing
    %>
    
  • 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, Seconda Parte

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

    Nell’intervento precedente ho trattato la creazione del database che utilizzeremo per memorizzare gli interventi del blog. Vedremo ora come realizzare la pagina di amministrazione, che consentirà all’autore di inserire gli interventi e le rispettive categorie.
    Il login verrà gestito attraverso un Membership Provider specifico per SQLite.

    Clicca qui per scaricare il progetto realizzato fino a questo punto!

    Aggiunta dei file per Membership e Roles Provider

    Le classi necessarie alla gestione dell’autenticazione sono MSQLiteRoleProvider.cs e MSQLiteMembershipProvider.cs e si trovano all’interno del progetto di esempio disponibile per il download in questa stessa pagina, oppure possono essere scaricate da qui.
    Il files vanno posizionati nella cartella App_Code del sito. Per maggiori informazioni: Membership & Role Provider per database SQLite

    Il file Web.config

    Prima di iniziare la vera e propria costruzione della pagina di amministrazione, è necessario specificare alcune impostazioni nel file di configurazione. In particolare dobbiamo:

    • Aggiungere una stringa di connessione al database:
        <connectionStrings>
          <add connectionString="Data Source=|DataDirectory|blog.db;"
              name="ExampleBlogConnString"
              providerName="System.Data.SQLite"/>
        </connectionStrings>
      

      Notate l’uso della parola chiave |DataDirectory|, che indica il percorso alla cartella App_Data del sito.

    • Forzare il login basato su Forms:
      <authentication mode="Forms"/>
      
    • Impostare i providers di autenticazione:
         <membership defaultProvider="MSQLiteMembershipProvider"
              userIsOnlineTimeWindow="30">
      <providers>
              <clear/>
              <add name="MSQLiteMembershipProvider"
                  type="Minifloppy.it.Providers.MSQLiteMembershipProvider"
                  connectionStringName="ExampleBlogConnString"
                  applicationName="ExampleBlog"
                  enablePasswordRetrieval="false"
                  enablePasswordReset="true"
                  requiresQuestionAndAnswer="true"
                  requiresUniqueEmail="true"
                  passwordFormat="Hashed"
                  writeExceptionsToEventLog="true"/>
            </providers>
          </membership>
      
          <roleManager defaultProvider="MSQLiteRoleProvider"
              enabled="true"
              cacheRolesInCookie="true"
              cookieName=".ASPROLES"
              cookieTimeout="30"
              cookiePath="/"
              cookieRequireSSL="false"
              cookieSlidingExpiration="true"
              cookieProtection="All">
      <providers>
              <clear/>
              <add name="MSQLiteRoleProvider"
                  type="Minifloppy.it.Providers.MSQLiteRoleProvider"
                  connectionStringName="ExampleBlogConnString"
                  applicationName="ExampleBlog"
                  writeExceptionsToEventLog="true" />
            </providers>
          </roleManager>
      

    Continua a leggere »