Examinar los métodos Details y Delete

por Rick Anderson

Note

Hay disponible una versión actualizada de este tutorial que usa ASP.NET MVC 5 y Visual Studio 2013. Es más seguro, mucho más fácil de seguir y demuestra más características.

En esta parte del tutorial, examinará los métodos Details y Delete generados automáticamente.

Examinar los métodos Details y Delete

Abra el controlador de Movie y examine el método Details.

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);
}

El motor de scaffolding de MVC que creó este método de acción agrega un comentario que muestra una solicitud HTTP que invoca el método. En este caso, se trata de una solicitud GET con tres segmentos de dirección URL, el controlador de Movies, el método Details y un valor de ID.

Code First facilita la búsqueda de datos mediante el método Find. Una característica de seguridad importante integrada en el método es que el código comprueba que el método Find ha encontrado una película antes de que el código intente hacer nada con ella. Por ejemplo, un pirata informático podría introducir errores en el sitio cambiando la dirección URL creada por los vínculos de http://localhost:xxxx/Movies/Details/1 a algo parecido a http://localhost:xxxx/Movies/Details/12345 (o a algún otro valor que no represente una película real). Si no ha buscado una película nula, una película nula produciría un error de base de datos.

Examine los métodos Delete y 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");
}

Tenga en cuenta que el método HTTP Get``Delete no elimina la película especificada, sino que devuelve una vista de la película en la que puede enviar (HttpPost) la eliminación. La acción de efectuar una operación de eliminación en respuesta a una solicitud GET (o con este propósito efectuar una operación de edición, creación o cualquier otra operación que modifique los datos) genera una vulnerabilidad de seguridad. Para obtener más información, consulte la entrada de blog de Stephen Walther ASP.NET MVC Tip #46: no use los vínculos de eliminación porque crean carencias de seguridad.

El método HttpPost que elimina los datos se denomina DeleteConfirmed para proporcionar al método HTTP POST una firma o nombre únicos. Las dos firmas de método se muestran a continuación:

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

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

Common Language Runtime (CLR) requiere métodos sobrecargados para disponer de una firma de parámetro única (mismo nombre de método, pero lista de parámetros diferente). Sin embargo, aquí necesita dos métodos de eliminación: uno para GET y otro para POST, que ambos tienen la misma firma de parámetro. (ambos deben aceptar un número entero como parámetro).

Para ordenar esto, puede hacer un par de cosas. Uno es asignar nombres distintos a los métodos. que es lo que hizo el mecanismo de scaffolding en el ejemplo anterior. Pero esto implica un pequeño problema: ASP.NET asigna segmentos de una dirección URL a los métodos de acción por nombre y, si cambia el nombre de un método, normalmente el enrutamiento no podría encontrar ese método. La solución es la que ve en el ejemplo, que consiste en agregar el atributo ActionName("Delete") al método DeleteConfirmed. De este modo, se realiza la asignación del sistema de enrutamiento de forma eficaz para que una dirección URL que incluya /Delete/para una solicitud post busque el método DeleteConfirmed.

Otra forma habitual de evitar un problema con los métodos que tienen nombres y firmas idénticos es cambiar artificialmente la firma del método POST para incluir un parámetro no utilizado. Por ejemplo, algunos desarrolladores agregan un tipo de parámetro FormCollection que se pasa al método POST y, a continuación, simplemente no usan el parámetro:

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");
}

Resumen

Ahora tiene una aplicación ASP.NET MVC completa que almacena los datos en una base de datos local. Puede crear, leer, actualizar, eliminar y buscar películas.

Pasos siguientes

Después de compilar y probar una aplicación Web, el siguiente paso es ponerla a disposición de otras personas a través de Internet. Para ello, tiene que implementarlo en un proveedor de hospedaje Web. Microsoft ofrece hospedaje web gratuito para un máximo de 10 sitios web en una cuenta de prueba gratuita de Windows Azure. Le sugiero que siga el tutorial implementación de una aplicación ASP.NET MVC segura con pertenencia, OAuth y SQL Database en un sitio web de Windows Azure. Un tutorial excelente es el nivel intermedio de Tom Dykstra, que crea un modelo de datos Entity Framework para una aplicación ASP.NET MVC. Stackoverflow y los foros de ASP.NET MVC son un buen lugar para formular preguntas. Síganos en Twitter para que pueda obtener actualizaciones en los tutoriales más recientes.

Los comentarios son bienvenidos.

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