Condividi tramite


Miglioramento dei dettagli e dei metodi di eliminazione (VB)

di Rick Anderson

Questa esercitazione illustra le nozioni di base per la creazione di un'applicazione Web MVC ASP.NET con Microsoft Visual Web Developer 2010 Express Service Pack 1, una versione gratuita di Microsoft Visual Studio. Prima di iniziare, assicurarsi di aver installato i prerequisiti elencati di seguito. È possibile installarli tutti facendo clic sul collegamento seguente: Programma di installazione della piattaforma Web. In alternativa, è possibile installare singolarmente i prerequisiti usando i collegamenti seguenti:

Se si usa Visual Studio 2010 anziché Visual Web Developer 2010, installare i prerequisiti facendo clic sul collegamento seguente: Prerequisiti di Visual Studio 2010.

Per questo argomento è disponibile un progetto Visual Web Developer con VB.NET codice sorgente. Scaricare la versione VB.NET. Se si preferisce C#, passare alla versione C# di questa esercitazione.

In questa parte dell'esercitazione verranno apportati alcuni miglioramenti ai metodi e Delete generati Details automaticamente. Queste modifiche non sono necessarie, ma con pochi piccoli bit di codice, è possibile migliorare facilmente l'applicazione.

Miglioramento dei dettagli e dei metodi delete

Quando si esegue lo scaffolding del Movie controller, ASP.NET codice generato da MVC ottimale, ma che può essere reso più affidabile con poche piccole modifiche.

Aprire il Movie controller e modificare il Details metodo restituendo HttpNotFound quando non viene trovato un filmato. È anche necessario modificare il Details metodo per impostare un valore predefinito per l'ID passato. Sono state apportate modifiche simili al Edit metodo nella parte 6 di questa esercitazione. Tuttavia, è necessario modificare il tipo restituito del Details metodo da ViewResult a ActionResult, perché il HttpNotFound metodo non restituisce un ViewResult oggetto . Nell'esempio seguente viene illustrato il metodo modificato Details .

Public Function Details(Optional ByVal id As Integer = 0) As ActionResult
    Dim movie As Movie = db.Movies.Find(id)
    If movie Is Nothing Then
        Return HttpNotFound()
    End If
    Return View(movie)
End Function

Code First semplifica la ricerca di dati usando il Find metodo . Una funzionalità di sicurezza importante integrata nel metodo è che il codice verifica che il Find metodo abbia trovato un filmato prima che il codice tenti di eseguire qualsiasi operazione con esso. Ad esempio, un hacker potrebbe introdurre errori nel sito modificando l'URL creato dai collegamenti da http://localhost:xxxx/Movies/Details/1 a qualcosa di simile http://localhost:xxxx/Movies/Details/12345 (o un altro valore che non rappresenta un film effettivo). Se non si esegue il controllo di un filmato Null, potrebbe verificarsi un errore del database.

Analogamente, modificare i Delete metodi e DeleteConfirmed per specificare un valore predefinito per il parametro ID e restituire HttpNotFound quando non viene trovato un filmato. I metodi aggiornati Delete nel Movie controller sono illustrati di seguito.

' GET: /Movies/Delete/5

 Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     Return View(movie)
 End Function

 '
 ' POST: /Movies/Delete/5

 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     db.Movies.Remove(movie)
     db.SaveChanges()
     Return RedirectToAction("Index")
 End Function

Si noti che il Delete metodo non elimina i dati. L'esecuzione di un'operazione di eliminazione in risposta a una richiesta GET (o l'esecuzione di un'operazione di modifica, di creazione o di qualsiasi altra azione che modifica i dati) introduce un problema di sicurezza.

Il metodo HttpPost che elimina i dati è denominato DeleteConfirmed per fornire al metodo HTTP POST un nome o una firma univoca. Le firme dei due metodi sono illustrate di seguito:

Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
 
 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult

Common Language Runtime (CLR) richiede metodi di overload per avere una firma univoca (stesso nome, elenco di parametri diverso). Tuttavia, qui sono necessari due metodi Delete, uno per GET e uno per POST, che richiedono entrambe la stessa firma. Entrambi devono accettare un singolo intero come parametro.

Per risolvere questo problema, puoi fare un paio di cose. Uno consiste nell'assegnare nomi diversi ai metodi. Questo è quello che abbiamo fatto nell'esempio precedente. Tuttavia in questo modo si introduce un piccolo problema: ASP.NET esegue il mapping dei segmenti di un URL ai metodi di azione in base al nome e, se si rinomina un metodo, generalmente il routing non è in grado di trovare questo metodo. La soluzione è mostrata nell'esempio e consiste nell'aggiungere l'attributo ActionName("Delete") al metodo DeleteConfirmed. Ciò esegue in modo efficace il mapping per il sistema di routing in modo che un URL che includa /Delete/per una richiesta POST trovi il DeleteConfirmed metodo .

Un altro modo per evitare un problema con metodi con nomi e firme identici consiste nel modificare artificialmente la firma del metodo POST in modo da includere un parametro inutilizzato. Ad esempio, alcuni sviluppatori aggiungono un tipo di FormCollection parametro passato al metodo POST e quindi semplicemente non usano il parametro :

Public Function Delete(ByVal fcNotUsed As FormCollection, Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
    Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function

Conclusione

È ora disponibile un'applicazione MVC completa ASP.NET che archivia i dati in un database di SQL Server Compact. È possibile creare, leggere, aggiornare, eliminare e cercare film.

Screenshot che mostra la pagina Indice di ricerca nell'app film M V C. La pagina mostra un elenco di quattro film.

Questa esercitazione di base illustra come creare controller, associarli alle visualizzazioni e passare dati hardcoded. È stato quindi creato e progettato un modello di dati. Entity Framework Code First ha creato un database dal modello di dati in tempo reale e il sistema di scaffolding MVC ASP.NET ha generato automaticamente i metodi di azione e le viste per le operazioni CRUD di base. È stato quindi aggiunto un modulo di ricerca che consente agli utenti di eseguire ricerche nel database. Il database è stato modificato in modo da includere una nuova colonna di dati e quindi sono state aggiornate due pagine per creare e visualizzare questi nuovi dati. È stata aggiunta la convalida contrassegnando il modello di dati con attributi dello spazio dei DataAnnotations nomi . La convalida risultante viene eseguita nel client e nel server.

Se si vuole distribuire l'applicazione, è utile testare prima l'applicazione nel server IIS 7 locale. È possibile usare questo collegamento al programma di installazione della piattaforma Web per abilitare l'impostazione IIS per le applicazioni ASP.NET. Vedere i collegamenti di distribuzione seguenti:

È ora consigliabile passare alle esercitazioni intermedie creazione di un modello di dati di Entity Framework per un'applicazione MVC ASP.NET e mVC Music Store , per esplorare gli articoli ASP.NET su MSDN e per consultare i numerosi video e le risorse disponibili per https://asp.net/mvc altre informazioni su ASP.NET MVC! I forum ASP.NET MVC sono un ottimo posto per porre domande.

Buon lavoro.

— Scott Hanselman (http://hanselman.com e @shanselman su Twitter) e Rick Anderson blogs.msdn.com/rickAndy