Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Controladores y métodos de acción en aplicaciones de ASP.NET MVC

El marco de ASP.NET MVC asigna direcciones URL a las clases a las que se hace referencia como controladores. Los controladores procesan solicitudes entrantes, controlan los datos proporcionados por el usuario y las interacciones y ejecutan la lógica de la aplicación adecuada. Una clase de controlador llama normalmente a un componente de vista independiente para generar el marcado HTML para la solicitud.

La clase base para todos los controladores es la clase ControllerBase, que proporciona el control general de MVC. La clase Controller hereda de ControllerBase y es la implementación predeterminada de un controlador. La clase Controller es responsable de las fases del procesamiento siguientes:

  • Localizar el método de acción adecuado para llamar y validar que se le puede llamar.

  • Obtener los valores para utilizar como argumentos del método de acción.

  • Controlar todos los errores que se puedan producir durante la ejecución del método de acción.

  • Proporcionar la clase WebFormViewEngine predeterminada para representar los tipos de página ASP.NET (vistas).

    NotaNota:

    Para ayudar a proteger el acceso a los controladores y métodos de acción, puede utilizar la clase AuthorizeAttribute.

Todas las clases de controlador deben llevar el sufijo "Controller" en su nombre. En el ejemplo siguiente se muestra la clase de controlador de ejemplo, que se denomina HomeController. Esta clase de controlador contiene métodos de acción que representan las páginas de vista.


[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}


En las aplicaciones ASP.NET que no utilizan el marco de MVC, la interacción con el usuario se organiza en torno a páginas y en torno a generar y controlar eventos desde la página y desde los controles de la página. En cambio, la interacción del usuario con aplicaciones ASP.NET MVC se organiza en torno a los controladores y métodos de acción. El controlador define los métodos de acción. Los controladores pueden incluir tantos métodos de acción como sea necesario.

Los métodos de acción tienen normalmente una asignación unívoca con las interacciones del usuario. Son ejemplos de interacciones del usuario especificar una dirección URL en el explorador, hacer clic en un vínculo y enviar un formulario. Cada una de estas interacciones del usuario produce el envío de una solicitud al servidor. En cada caso, la dirección URL de la solicitud incluye información que el marco de MVC utiliza para invocar un método de acción.

Cuando un usuario introduce una dirección URL en el explorador, la aplicación MVC usa reglas de enrutamiento que están definidas en el archivo Global.asax para analizar la dirección URL y determinar la ruta de acceso del controlador. A continuación, el controlador determina el método de acción adecuado para administrar la solicitud. De forma predeterminada, la dirección URL de una solicitud se trata como una subruta de acceso que incluye el nombre del controlador seguido por el nombre de la acción. Por ejemplo, si un usuario escribe la dirección URL http://contoso.com/MyWebSite/Products/Categories, la subruta de acceso es /Products/Categories. La regla de enrutamiento predeterminada trata "Products" como el prefijo del controlador, que debe finalizar con "Controller" (como en ProductsController). Trata "Categories" como el nombre de la acción. Por consiguiente, la regla de enrutamiento invoca el método Categories del controlador Products para procesar la solicitud. Si la dirección URL termina en /Products/Detail/5, la regla de enrutamiento predeterminada trata "Detail" como el nombre de la acción y se invoca el método Detail del controlador Products para procesar la solicitud. De forma predeterminada, el valor "5" en la dirección URL se pasa al método Detail como un parámetro.

En el ejemplo siguiente se muestra una clase de controlador que tiene un método de acción HelloWorld.

public class MyController : Controller
{
    public ActionResult HelloWorld()
    {
        ViewData["Message"] = "Hello World!";
        return View();
    }
}

La mayoría de los métodos de acción devuelven una instancia de una clase que se deriva de ActionResult. La clase ActionResult es la base de todos los resultados de acciones. Sin embargo, hay tipos de resultados de acción diferentes, dependiendo de la tarea que el método de acción esté realizando. Por ejemplo, la acción más frecuente consiste en llamar al método View. El método View devuelve una instancia de la clase ViewResult, que se deriva de ActionResult.

Puede crear métodos de acción que devuelven un objeto de cualquier tipo, como una cadena, un entero o un valor booleano. Estos tipos de valor devueltos se incluyen en un tipo ActionResult adecuado antes de representarse en la secuencia de respuesta.

En la tabla siguiente se muestran los tipos de resultado de acción integrados y los métodos auxiliares de acción que los devuelven.

Resultado de la acción

Método auxiliar

Descripción

ViewResult

View

Representa una vista como una página web.

PartialViewResult

PartialView

Representa una vista parcial, que define una sección de una vista que se puede representar dentro de otra vista.

RedirectResult

Redirect

Redirecciona a otro método de acción utilizando su dirección URL.

RedirectToRouteResult

RedirectToAction

RedirectToRoute

Redirecciona a otro método de acción.

ContentResult

Content

Devuelve un tipo de contenido definido por el usuario.

JsonResult

Json

Devuelve un objeto JSON serializado.

JavaScriptResult

JavaScript

Devuelve un script que se puede ejecutar en el cliente.

FileResult

File

Devuelve la salida binaria para escribir en la respuesta.

EmptyResult

(Ninguno)

Representa un valor devuelto que se utiliza si el método de acción debe devolver un resultado null (vacío).

De forma predeterminada, el marco de MVC trata todos los métodos públicos de una clase de controlador como métodos de acción. Si su clase de controlador contiene un método público y no desea que sea un método de acción, debe marcar ese método con el atributo NonActionAttribute.

En el ejemplo siguiente se muestra un método marcado con el atributo NonAction.

[NonAction]
private void DoSomething()
{
    // Method logic.
}

De forma predeterminada, los valores para los parámetros de los métodos de acción se recuperan de la colección de datos de la solicitud. La colección de datos incluye los pares nombre/valor para los datos del formulario, los valores de las cadenas de consulta y los valores de las cookies.

La clase de controlador localiza el método de acción y determina los valores de parámetro para el método de acción, basándose en la instancia RouteData y en los datos del formulario. Si no se puede analizar el valor del parámetro, y si el tipo del parámetro es un tipo de referencia o un tipo de valor que acepta valores NULL, se pasa null como el valor de parámetro. De lo contrario, se producirá una excepción.

Hay varias maneras de tener acceso a los valores de parámetro de dirección URL en los métodos de acción de las clases de controlador. La clase Controller expone las propiedades Response y Request a las que se puede tener acceso en un método de acción. Estas propiedades tienen la misma semántica que los objetos HttpResponse y HttpRequest que ya forman parte de ASP.NET. Sin embargo, los objetos Response y Request de la clase Controller aceptan objetos que implementan las clases abstractas HttpResponseBase y HttpRequestBase en lugar de ser clases sealed. Estas clases base facilitan la creación de objetos ficticios, lo cual a su vez facilita la creación de las pruebas unitarias para las clases de controlador.

En el ejemplo siguiente se muestra cómo utilizar el objeto Request para recuperar un valor de la cadena de consulta denominado id.

public void Detail()
{
    int id = Convert.ToInt32(Request["id"]);
}

El marco de ASP.NET MVC puede asignar automáticamente valores de parámetro de dirección URL a los valores de parámetro de los métodos de acción. De forma predeterminada, si un método de acción toma un parámetro, el marco de MVC examina los datos de la solicitud entrante y determina si la solicitud contiene un valor de solicitud HTTP con el mismo nombre. En ese caso, el valor de solicitud se pasa automáticamente al método de acción.

En el ejemplo siguiente se muestra una variación del ejemplo anterior. En esta variación se supone que el parámetro id se asigna a un valor de solicitud que también se denomina id. Debido a esta asignación automática, el método de acción no tiene que incluir el código para recibir un valor de parámetro de la solicitud y el valor de parámetro es por consiguiente más fácil de utilizar.

public ResultAction Detail(int id)
{
    ViewData["DetailInfo"] = id;
    return View();
}

También puede incrustar valores de parámetro como parte de la dirección URL en lugar de como valores de la cadena de consulta. Por ejemplo, en lugar de utilizar la dirección URL con una cadena de consulta como /Products/Detail?id=3, puede utilizar una dirección URL como /Products/Detail/3. La regla de la asignación de ruta predeterminada tiene el formato /{controller}/{action}/{id}. Si hay una subruta de acceso de la dirección URL después de los nombres de acción y de controlador en la dirección URL, se trata como un parámetro denominado id y se pasa automáticamente al método de acción como un valor de parámetro.

El marco de MVC también admite argumentos opcionales para los métodos de acción. Los parámetros opcionales en el marco de MVC se administran utilizando argumentos de tipo que acepta valores NULL para los métodos de acción de controlador. Por ejemplo, si un método puede tomar una fecha como parte de la cadena de consulta, pero desea que el valor predeterminado sea la fecha de hoy si falta el parámetro de cadena de consulta, puede utilizar un código como el del ejemplo siguiente:

public ActionResult ShowArticles(DateTime? date)
{
    if(!date.HasValue)
    {
        date = DateTime.Now;
    }
    // ...
}

Si la solicitud incluye un valor para el parámetro de fecha, ese valor se pasa al método ShowArticles. Si la solicitud no incluye un valor para este parámetro, el argumento es null y el controlador puede tomar las medidas que se requieran para administrar el parámetro ausente.

Adiciones de comunidad

AGREGAR
Mostrar: