Share via


Esame dei metodi di eliminazione e dettagli generati automaticamente

di Rick Anderson

Nota

Una versione aggiornata di questa esercitazione è disponibile qui usando la versione più recente di Visual Studio. La nuova esercitazione usa ASP.NET Core MVC, che offre molti miglioramenti in questa esercitazione.

Questa esercitazione illustra ASP.NET Core MVC con i controller e le viste. Razor Pages è una nuova alternativa in ASP.NET Core, un modello di programmazione basato su pagine che semplifica e rende più produttiva la creazione dell'interfaccia utente Web. È consigliabile provare l'esercitazione sulle pagine Razor prima della versione MVC. L'esercitazione sulle pagine Razor:

  • È più semplice da seguire.
  • Riguarda più funzionalità.
  • È l'approccio preferito per lo sviluppo di nuove app.

In questa parte dell'esercitazione verranno esaminati 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. Nel menu a discesa Crea i dettagli sono in rosso.

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 MoviesDetails metodo e un ID valore.

Code First semplifica la ricerca dei dati usando il Find metodo . Una funzionalità di sicurezza importante incorporata 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 filmato effettivo). Se non si è verificato un filmato Null, un filmato Null genera un errore di 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 metodo HTTP GET Delete 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. Per altre informazioni su questo argomento, vedere il post di blog di Stephen Walther ASP.NET MVC Tip #46 - Don't use Delete Links because they create Security Hole( Non usare Collegamenti eliminati perché creano buchi 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. Questo 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 ASP.NET completa 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 altri utenti da usare su Internet. A tale scopo, è necessario distribuirlo in un provider di hosting Web. Microsoft offre l'hosting Web gratuito per un massimo di 10 siti Web in un account di valutazione di Azure gratuito. È consigliabile seguire l'esercitazione Distribuire un'app MVC sicura ASP.NET con appartenenza, OAuth e database SQL in 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 per porre domande. Seguimi su Twitter per poter ottenere aggiornamenti sulle mie ultime esercitazioni.

Il feedback è un benvenuto.

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