Condividi tramite


Esame dei dettagli e dei metodi di azione delete

di Rick Anderson

Nota

Una versione aggiornata di questa esercitazione è disponibile qui che usa ASP.NET MVC 5 e Visual Studio 2013. È più sicuro, molto più semplice da seguire e dimostra più funzionalità.

In questa parte dell'esercitazione si esamineranno i metodi e Delete generati Details automaticamente.

Analisi dei dettagli e dei metodi di eliminazione

Aprire il Movie controller ed esaminare il Details metodo .

Screenshot che mostra la scheda Movies Controller dot c s . I dettagli sono selezionati nel menu a discesa a destra.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Il motore di scaffolding MVC che ha creato questo metodo di azione aggiunge un commento che mostra una richiesta HTTP che richiama il metodo . In questo caso si tratta di una GET richiesta con tre segmenti di URL, il controller, il Movies Details metodo e un ID valore.

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 è verificato un filmato Null, un filmato null genererà un errore del database.

Esaminare i metodi Delete e DeleteConfirmed.

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Si noti che il HTTP Get``Delete metodo non elimina il filmato specificato, restituisce una visualizzazione del film in cui è possibile inviare (HttpPost) l'eliminazione. 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:

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

Il Common Language Runtime (CLR) richiede metodi in rapporto di overload per disporre di una firma di parametro univoca, ovvero lo stesso nome di metodo ma un elenco diverso di parametri. Tuttavia, qui sono necessari due metodi Delete, uno per GET e uno per POST, che hanno entrambe la stessa firma del parametro. 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. Questa operazione è stata eseguita dal meccanismo di scaffolding 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 comune 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 ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Riepilogo

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

Screenshot che mostra la pagina M V C Movie Search Index.

Passaggi successivi

Dopo aver creato e testato un'applicazione Web, il passaggio successivo consiste nel renderlo disponibile ad altre persone da usare su Internet. A tale scopo, è necessario distribuirlo in un provider di hosting Web. Microsoft offre hosting Web gratuito per un massimo di 10 siti Web in un account di valutazione gratuito di Windows Azure. È consigliabile seguire l'esercitazione Distribuire un'app MVC sicura ASP.NET con appartenenza, OAuth e database SQL a un sito Web di Windows Azure. Un'esercitazione eccellente è il livello intermedio di Tom Dykstra Creazione di un modello di dati di Entity Framework per un'applicazione MVC ASP.NET. Stackoverflow e i forum ASP.NET MVC sono un ottimo posto in cui porre domande. Seguimi su Twitter per ottenere aggiornamenti sulle mie ultime esercitazioni.

Il feedback è il benvenuto.

Twitter di Rick Anderson : @RickAndMSFT
Scott Hanselman twitter: @shanselman