Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Interagire con il database

Completiamo il progetto FindYourLanguage con la memorizzazione dei dati
Completiamo il progetto FindYourLanguage con la memorizzazione dei dati
Link copiato negli appunti

In questa lezione completeremo il progetto FindYourLanguage collegando la pagina di ricerca alla visualizzazione di dettaglio e memorizzando le ricerche effettuate dagli utenti in modo da pilotare in modo corretto la classifica. Questa attività ci darà anche l'opportunità di sperimentare alcuni aspetti che ancora non abbiamo affrontato, come ad esempio il salvataggio dei dati su di un database.

La ricerca su database

Ciò che faremo è modificare 'dettaglio.cshtml' in modo che recuperi il termine di ricerca dalla pagina 'index.cshtml' e che lo memorizzi nel database con il nome dell'utente, se presente, prima di mostrare a video i risultati.

Per affinare un po' la procedura diciamo anche che se StackOverflow non contiene risultati in merito alla chiave di ricerca allora possiamo desumere si tratti di un errore di digitazione ed evitare di memorizzare l'operazione.

Iniziamo col legare tra loro le due pagine modificando il modo in cui la variabile 'language' viene valorizzata:

// riga 4 di dettaglio.cshtml
var language = Request["box_ricerca"].ToLower();

Se ora valorizziamo il box di ricerca nella home del progetto e premiamo 'Ricerca' noteremo come il tutto funzioni perfettamente.

Attraverso l'istruzione Request["box_ricerca"] abbiamo chiesto al sistema di recuperare per noi la variabile inserita dall'utente nel campo di testo 'box_ricerca' ed inviata attraverso la pressione del tasto 'Ricerca'. Proviamo a cercare 'C#':

Figura 14. Eccezione
(clic per ingrandire)


Eccezione

Ops! Il carattere '#' ha un significato speciale all'interno dell'URL, questo significa che non può essere inserito direttamente in una interrogazione oData ma deve essere prima sanitizzato, ovverosia ricodificato attraverso l'uso di un gruppo di caratteri sostitutivi. Per ottenere questo risultato utilizziamo la comoda funzione UrlEncode che si comporta come nell'esempio seguente:

var stringa = "c#";
stringa = HttpUtility.UrlEncode(string);
// ora il valore della stringa è c%23
Ora inseriamo questo snippet nell'interrogazione oData:
// riga 5 di dettaglio.cshtml
var result = OData.Open("http://data.stackexchange.com/stackoverflow/atom/Posts")
             .Where("substringof('" + HttpUtility.UrlEncode(language) + ">',Tags) eq true and PostTypeId eq 1")
			 .OrderBy("Score desc&$top=10")
			 .Get();

Ora dobbiamo controllare che l'interrogazione ritorni almeno un risultato per certificare la ricerca come valida:

<section id="risposta">
@{
  if(result.Count == 0) {
  <h1> Non ci risulta che @language sia un linguaggio di programmazione</h1>
  } else {
  <h1>Tutto e ancora di più in merito a @language</h1>
  // stampa della WebGrid ...
  }
}
<footer>
<a href="/">« ritorna al box di ricerca</a>
</footer>
</section>

Sinceriamoci della bontà della nostra implementazione eseguendo alcune ricerche sia con linguaggi esistenti sia con parole fasulle per validare il funzionamento del meccanismo.

Salvare i dati

Siamo ad un passo dal completamento del progetto: dobbiamo solo fare in modo che la variabile language venga memorizzata nel database. Per ottenere questo risultato costruiamo una funzione SalvaRicerca che accetta come argomento il nome del linguaggio da memorizzare.

Aggiungiamo quindi all'interno del blocco @functions nel file utility.cshtml quanto segue:

public static void SalvaRicerca(string ricerca) {
  var db= Database.Open("FindYourLanguage");
  var utente = UtenteFacebook();
  var nome_utente = ( utente == null ? null : utente.Name);
  if (nome_utente != null) {
    db.Execute("INSERT INTO ricerche (utente, linguaggio) VALUES (@0,@1)", nome_utente, ricerca);
  } else {
    db.Execute("INSERT INTO ricerche (linguaggio) VALUES (@0)", ricerca);
  }
}

e modifichiamo dettaglio.cshtml assicurandoci che la funzione venga invocata:

// riga 10 di dettaglio.cshtml, dopo l'esecuzione della query oData
if(result.Count > 0) {
  utility.SalvaRicerca(language);
}

Se la ricerca è vuota?

L'ultimo caso da tenere in considerazione è l'invio di una form di ricerca completamente vuota. In questo caso la soluzione migliore è quella di redirezionare l'utente nuovamente sulla home, in modo che possa eseguire una nuova ricerca. Aggiungiamo quindi questa:

// istruzione in testa a 'dettaglio.cshtml'
if(Request["box_ricerca"] == null) {
  Response.Redirect(@Href("~/index.cshtml"));
}

Nella prossima lezione vedremo come pubblicare il nostro progetto attraverso le funzionalità offerte da WebMatrix.

Ti consigliamo anche