Gestione delle News in ASP.NET

Siti dinamici con ASP.NET
Impara a creare siti ed applicazioni Web con Microsoft .NET

Scritto da Luca Ruggiero nella sezione Asp.NET

Concesso in esclusiva a MrWebmaster.it - E' vietata la pubblicazione senza espresso consenso del proprietario

I siti dinamici e frequentemente aggiornati dispongono, per comodità e velocità di esecuzione, di un sistema automatico per l'inserimento di notizie, per la lettura della singola notizia, per la visualizzazione di un elenco di tutte le notizie pubblicate ed un box da inserire, ad esempio, in Homepage per mostrare le ultime 10 (o N che sia) notizie pubblicate.

Ci muoveremo esattamente in questa direzione, utilizzando un MDB che chiameremo database.mdb con la tabella news composta dai campi id di tipo Contatore, data di tipo Testo (lunghezza 30), titolo di tipo Testo (lunghezza 50), descrizione di tipo Memo e click di tipo Numerico. Per l'accesso ai dati utilizzeremo ADO tradizionale: si legga quindi il capitolo 9 della guida ad ASP.NET per maggiori informazioni sull'interoperabilità tra ADO ed ASP.NET.

I file di cui abbiamo bisogno sono una Homepage in cui inserire il box con le ultimissime, un file in cui mostrare l'elenco completo delle news, uno in cui leggere la notizia (ed aggiornare un contatore di statistiche di accesso) ed un pannello di controllo privato per inserire le notizie. Utilizzeremo quindi i file index.aspx (Homepage), news.aspx (mostra tutte le notizie), leggi.aspx (mostra la notizia vera e propria) e pannello.aspx (permette all'amministratore se sito di inserire una nuova notizia).

Iniziamo dal pannello di controllo, di cui mostro il codice commentato:

<%@ Page Language="VB" ValidateRequest="false" %>
<%@ Assembly Name="ADODB" %>
<%@ Import Namespace="ADODB" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    Private cn As New ADODB.Connection

    Private Sub Inserisci(sender As Object, e As EventArgs)
        ' Eseguo un basilare controllo sui campi
        If titolo.Text = "" Or descrizione.Text = "" Then
            Messaggio.Text = "I campi sono entrambi obbligatori"
            Exit Sub
        End If
        ' Creo la stringa SQL di inserimento
        Dim SQL As String = "INSERT INTO news " _
        & "(data, titolo, descrizione)" _
        & "VALUES" _
        & "('" & FormatDateTime(Now(), 1) & "', " _
        & "'" & Replace(titolo.Text, "'", "''") & "', " _
        & "'" & Replace(descrizione.Text, "'", "''") & "')"
        ' Apro la connessione, eseguo la INSERT e chiudo la connessione
        cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" _
        & Server.MapPath("database.mdb"))
        cn.Execute(SQL)
        cn.Close()
        Messaggio.Text = "News inserita con successo"
    End Sub
</script>
<html>
    <head>
        <title>Gestione delle News in ASP.NET</title>
    </head>
<body>

<form id="Modulo" runat="server">
    <table width="300" align="center" border="1">
        <tr><td><b>Inserisci News</b></td></tr>
        <tr>
            <td>
                Titolo<br>
                <asp:TextBox id="titolo" runat="server" MaxLength="50" Width="100%" />
                <br>
                Descrizione<br>
                <asp:TextBox id="descrizione" runat="server" MaxLength="50" Width="100%" />
                <br>
                <asp:Button runat="server" Text="Inserisci" OnClick="Inserisci" />
            </td>
        </tr>
    </table>
    <p align="center"><asp:Label id="Messaggio" runat="server" /></p>
</form>

</body>
</html>
Andiamo a scrivere di nostro pugno solo il titolo e la descrizione della notizia, mentre la data viene calcolata in automatico dal server ed i click sono impostati per default a zero (0), trattandosi di un campo di tipo Numerico.

Di seguito il codice commentato del box da posizionare in Homepage:
<%@ Page Language="VB" ValidateRequest="false" %>
<%@ Assembly Name="ADODB" %>
<%@ Import Namespace="ADODB" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    Private cn As New ADODB.Connection
    Private rs As New ADODB.Recordset

    Private Sub Page_Load(sender As Object, e As EventArgs)
        ' Apro la connessione
        cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" _
        & Server.MapPath("database.mdb"))
        ' Estraggo solo 10 record ordinati in modo decrescente,
        ' quindi si tratta degli ultimi 10 record (notizie) inseriti
        rs.Open("SELECT TOP 10 * FROM news ORDER BY id DESC", cn, 1)
        ' Controllo che ci siano notizie presenti
        If rs.EOF Then
            NewsBox.Text = "Nessuna notizia presente"
        Else
            ' Formatto dinamicamente il codice HTML del box
            NewsBox.Text = ""
            While rs.EOF = False
                With NewsBox
                    .Text += "<b>::</b> "
                    .Text += "<a href='leggi.aspx?id=" & rs("id").Value & "'>"
                    .Text += rs("titolo").Value & "</a> "
                    .Text += "(" & rs("click").Value & ")<br>"
                End With
                rs.MoveNext()
            End While
        End If
        ' Un po di pulizia...
        rs.Close()
        cn.Close()
    End Sub
</script>
<html>
    <head>
        <title>Gestione delle News in ASP.NET</title>
    </head>
<body>

<form id="Modulo" runat="server">
    <table width="300" align="center" border="1">
        <tr><td><b>News</b></td></tr>
        <tr>
            <td><asp:Label id="NewsBox" runat="server" /></td>
        </tr>
    </table>
</form>

</body>
</html>
Lo stesso codice può essere utilizzato per il file news.aspx: è sufficiente modificare la query eliminando la clausola TOP 10, modificandola quindi da
SELECT TOP 10 * FROM news ORDER BY id DESC
a
SELECT * FROM news ORDER BY id DESC
Passiamo alla lettura della notizia:
<%@ Page Language="VB" ValidateRequest="false" %>
<%@ Assembly Name="ADODB" %>
<%@ Import Namespace="ADODB" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    Private cn As New ADODB.Connection
    Private rs As New ADODB.Recordset

    Private Sub Page_Load(sender As Object, e As EventArgs)
        ' Controllo il valore passato come parametro
        ' QueryString alla pagina per identificare la notizia
        Dim id As Integer = Request.QueryString("id")
        If IsNumeric(id) = False Then Response.Redirect("index.aspx")
        ' Apro la connessione
        cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" _
        & Server.MapPath("database.mdb"))
        ' Estraggo la notizia richiesta
        rs.Open("SELECT * FROM news WHERE id = " & id, cn, 1)
        ' Controllo che la notizia esista
        If rs.EOF Then
            Leggi.Text = "La News # " & id & " è inesistente"
        Else
           ' Creo dinamicamente il codice HTML della notizia
            With Leggi
                .Text =  ""
                .Text += "<b>" & rs("titolo").Value & "</b><br><br>"
                .Text += rs("descrizione").Value & "<br><br>"
                .Text += "<i>Pubblicata in data " & rs("data").Value & "</i>"
            End With
           ' Aggiorno il contaclick del record corrente
            cn.Execute("UPDATE news SET click = click + 1 WHERE id = " & id)
        End If
        ' Un po di pulizia...
        rs.Close()
        cn.Close()
    End Sub
</script>
<html>
    <head>
        <title>Gestione delle News in ASP.NET</title>
    </head>
<body>

<form id="Modulo" runat="server">
    <asp:Label id="Leggi" runat="server" /></td>
</form>

</body>
</html>

I più cliccati della sezione Asp.NET

:: Guida base ad Asp.NET (56.696)

:: I Validation Controls di Asp.NET (29.059)

:: Utilizzo delle QueryString con Asp.NET e C Sharp (23.369)

:: Visualizzare i record di un database Access con Asp.NET (20.956)

:: Un Guestbook in ASP.NET, Access e ADO (18.570)

:: Inviare email con Asp.NET: il Namespace System.Web.Mail (17.886)

:: Una Newsletter in ASP.NET (11.977)

:: Inserire dati in un database Access con Asp.NET (11.604)

:: Upload di file in Asp.NET e Javascript (11.322)

:: Risolvere un indirizzo IP ed individuare nome macchina e dominio in Asp.NET (9.971)

IN EVIDENZA
DOWNLOAD