Información general de ASP.NET Core MVCOverview of ASP.NET Core MVC

Por Steve SmithBy Steve Smith

ASP.NET Core MVC es un completo marco de trabajo para compilar aplicaciones web y API mediante el patrón de diseño Modelo-Vista-Controlador.ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

¿Qué es el patrón de MVC?What is the MVC pattern?

El patrón de arquitectura del controlador de vista de modelos (MVC) separa una aplicación en tres grupos de componentes principales: modelos, vistas y controladores.The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. Este patrón permite lograr la separación de intereses.This pattern helps to achieve separation of concerns. Con este patrón, las solicitudes del usuario se enrutan a un controlador que se encarga de trabajar con el modelo para realizar las acciones del usuario o recuperar los resultados de consultas.Using this pattern, user requests are routed to a Controller which is responsible for working with the Model to perform user actions and/or retrieve results of queries. El controlador elige la vista para mostrar al usuario y proporciona cualquier dato de modelo que sea necesario.The Controller chooses the View to display to the user, and provides it with any Model data it requires.

En el siguiente diagrama se muestran los tres componentes principales y cuál hace referencia a los demás:The following diagram shows the three main components and which ones reference the others:

Patrón de MVC

Con esta delineación de responsabilidades es más sencillo escalar la aplicación, porque resulta más fácil codificar, depurar y probar algo (modelo, vista o controlador) que tenga un solo trabajo.This delineation of responsibilities helps you scale the application in terms of complexity because it's easier to code, debug, and test something (model, view, or controller) that has a single job. Es más difícil actualizar, probar y depurar código que tenga dependencias repartidas entre dos o más de estas tres áreas.It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. Por ejemplo, la lógica de la interfaz de usuario tiende a cambiar con mayor frecuencia que la lógica de negocios.For example, user interface logic tends to change more frequently than business logic. Si el código de presentación y la lógica de negocios se combinan en un solo objeto, un objeto que contenga lógica de negocios deberá modificarse cada vez que cambie la interfaz de usuario.If presentation code and business logic are combined in a single object, an object containing business logic must be modified every time the user interface is changed. A menudo esto genera errores y es necesario volver a probar la lógica de negocio después de cada cambio mínimo en la interfaz de usuario.This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Nota

La vista y el controlador dependen del modelo.Both the view and the controller depend on the model. Sin embargo, el modelo no depende de la vista ni del controlador. However, the model depends on neither the view nor the controller. Esta es una de las ventajas principales de la separación.This is one of the key benefits of the separation. Esta separación permite compilar y probar el modelo con independencia de la presentación visual.This separation allows the model to be built and tested independent of the visual presentation.

Responsabilidades del modeloModel Responsibilities

El modelo en una aplicación de MVC representa el estado de la aplicación y cualquier lógica de negocios u operaciones que esta deba realizar.The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. La lógica de negocios debe encapsularse en el modelo, junto con cualquier lógica de implementación para conservar el estado de la aplicación.Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. Las vistas fuertemente tipadas normalmente usan tipos ViewModel diseñados para que contengan los datos para mostrar en esa vista.Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. El controlador crea y rellena estas instancias de ViewModel desde el modelo.The controller creates and populates these ViewModel instances from the model.

Responsabilidades de las vistasView Responsibilities

Las vistas se encargan de presentar el contenido a través de la interfaz de usuario.Views are responsible for presenting content through the user interface. Usan el motor de vistas de Razor para incrustar código .NET en formato HTML.They use the Razor view engine to embed .NET code in HTML markup. Debería haber la mínima lógica entre las vistas y cualquier lógica en ellas debe estar relacionada con la presentación de contenido.There should be minimal logic within views, and any logic in them should relate to presenting content. Si ve que necesita realizar una gran cantidad de lógica en los archivos de vistas para mostrar datos de un modelo complejo, considere la opción de usar un componente de vista, ViewModel, o una plantilla de vista para simplificar la vista.If you find the need to perform a great deal of logic in view files in order to display data from a complex model, consider using a View Component, ViewModel, or view template to simplify the view.

Responsabilidades del controladorController Responsibilities

Los controladores son los componentes que controlan la interacción del usuario, trabajan con el modelo y, en última instancia, seleccionan una vista para representarla.Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. En una aplicación de MVC, la vista solo muestra información; el controlador controla y responde a la interacción y los datos que introducen los usuarios.In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. En el patrón de MVC, el controlador es el punto de entrada inicial que se encarga de seleccionar con qué tipos de modelo trabajar y qué vistas representar (de ahí su nombre, ya que controla el modo en que la aplicación responde a una determinada solicitud).In the MVC pattern, the controller is the initial entry point, and is responsible for selecting which model types to work with and which view to render (hence its name - it controls how the app responds to a given request).

Nota

Los controladores no deberían complicarse con demasiadas responsabilidades.Controllers shouldn't be overly complicated by too many responsibilities. Para evitar que la lógica del controlador se vuelva demasiado compleja, saque la lógica de negocios fuera el controlador y llévela al modelo de dominio.To keep controller logic from becoming overly complex, push business logic out of the controller and into the domain model.

Sugerencia

Si piensa que el controlador realiza con frecuencia los mismos tipos de acciones, mueva estas acciones comunes en filtros.If you find that your controller actions frequently perform the same kinds of actions, move these common actions into filters.

Qué es ASP.NET Core MVCWhat is ASP.NET Core MVC

El marco de ASP.NET Core MVC es un marco de presentación ligero, de código abierto y con gran capacidad de prueba, que está optimizado para usarlo con ASP.NET Core.The ASP.NET Core MVC framework is a lightweight, open source, highly testable presentation framework optimized for use with ASP.NET Core.

ASP.NET Core MVC ofrece una manera basada en patrones de crear sitios web dinámicos que permitan una clara separación de intereses.ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. Proporciona control total sobre el marcado, admite el desarrollo controlado por pruebas (TDD) y usa los estándares web más recientes.It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

CaracterísticasFeatures

ASP.NET Core MVC incluye lo siguiente:ASP.NET Core MVC includes the following:

EnrutamientoRouting

ASP.NET Core MVC se basa en el enrutamiento de ASP.NET Core, un eficaz componente de asignación de URL que permite compilar aplicaciones que tengan direcciones URL comprensibles y que admitan búsquedas.ASP.NET Core MVC is built on top of ASP.NET Core's routing, a powerful URL-mapping component that lets you build applications that have comprehensible and searchable URLs. Esto permite definir patrones de nomenclatura de URL de la aplicación que funcionen bien para la optimización del motor de búsqueda (SEO) y para la generación de vínculos, sin tener en cuenta cómo se organizan los archivos en el servidor web.This enables you to define your application's URL naming patterns that work well for search engine optimization (SEO) and for link generation, without regard for how the files on your web server are organized. Puede definir las rutas mediante una sintaxis de plantilla de ruta adecuada que admita las restricciones de valores de ruta, los valores predeterminados y los valores opcionales.You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

El enrutamiento basado en la convención permite definir globalmente los formatos de URL que acepta la aplicación y cómo cada uno de esos formatos se asigna a un método de acción específico en un determinado controlador.Convention-based routing enables you to globally define the URL formats that your application accepts and how each of those formats maps to a specific action method on given controller. Cuando se recibe una solicitud entrante, el motor de enrutamiento analiza la URL y la hace coincidir con uno de los formatos de URL definidos. Después, llama al método de acción del controlador asociado.When an incoming request is received, the routing engine parses the URL and matches it to one of the defined URL formats, and then calls the associated controller's action method.

routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

El enrutamiento de atributos permite especificar información de enrutamiento mediante la asignación de atributos a los controladores y las acciones, que permiten definir las rutas de la aplicación.Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. Esto significa que las definiciones de ruta se colocan junto al controlador y la acción con la que están asociados.This means that your route definitions are placed next to the controller and action with which they're associated.

[Route("api/[controller]")]
public class ProductsController : Controller
{
  [HttpGet("{id}")]
  public IActionResult GetProduct(int id)
  {
    ...
  }
}

Enlace de modelosModel binding

El enlace de modelo de ASP.NET Core MVC convierte los datos de solicitud del cliente (valores de formulario, datos de ruta, parámetros de cadena de consulta, encabezados HTTP) en objetos que el controlador puede controlar.ASP.NET Core MVC model binding converts client request data (form values, route data, query string parameters, HTTP headers) into objects that the controller can handle. Como resultado, la lógica del controlador no tiene que realizar el trabajo de pensar en los datos de la solicitud entrante; simplemente tiene los datos como parámetros para los métodos de acción.As a result, your controller logic doesn't have to do the work of figuring out the incoming request data; it simply has the data as parameters to its action methods.

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

Validación de modelosModel validation

ASP.NET Core MVC admite la validación decorando el objeto de modelo con los atributos de validación de anotación de datos.ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. Los atributos de validación se comprueban en el lado cliente antes de que los valores se registren en el servidor, y también en el servidor antes de llamar a la acción del controlador.The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Una acción del controlador:A controller action:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
      // work with the model
    }
    // At this point, something failed, redisplay form
    return View(model);
}

El marco administra los datos de la solicitud de validación en el cliente y en el servidor.The framework handles validating request data both on the client and on the server. La lógica de validación especificada en tipos de modelo se agrega a las vistas representadas como anotaciones discretas y se aplica en el explorador con Validación de jQuery.Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

Inserción de dependenciasDependency injection

ASP.NET Core tiene compatibilidad integrada con la inserción de dependencias.ASP.NET Core has built-in support for dependency injection (DI). En ASP.NET Core MVC, los controladores pueden solicitar los servicios que necesiten a través de sus constructores, lo que les permite seguir el principio de dependencias explícitas.In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

La aplicación también puede usar la inserción de dependencias en archivos de vistas, usando la directiva @inject:Your app can also use dependency injection in view files, using the @inject directive:

@inject SomeService ServiceName
<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ServiceName.GetTitle</title>
</head>
<body>
    <h1>@ServiceName.GetTitle</h1>
</body>
</html>

FiltrosFilters

Los filtros ayudan a los desarrolladores a encapsular ciertas preocupaciones transversales, como el control de excepciones o la autorización.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Los filtros habilitan la ejecución de lógica de procesamiento previo y posterior para métodos de acción y pueden configurarse para ejecutarse en ciertos puntos dentro de la canalización de ejecución para una solicitud determinada.Filters enable running custom pre- and post-processing logic for action methods, and can be configured to run at certain points within the execution pipeline for a given request. Los filtros pueden aplicarse a controladores o acciones como atributos (o pueden ejecutarse globalmente).Filters can be applied to controllers or actions as attributes (or can be run globally). En el marco se incluyen varios filtros (como Authorize).Several filters (such as Authorize) are included in the framework. [Authorize] es el atributo que se usa para crear filtros de autorización MVC.[Authorize] is the attribute that is used to create MVC authorization filters.

[Authorize]
   public class AccountController : Controller
   {

ÁreasAreas

Las áreas ofrecen una manera de dividir una aplicación web ASP.NET Core MVC de gran tamaño en agrupaciones funcionales más pequeñas.Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. Un área es una estructura de MVC dentro de una aplicación.An area is an MVC structure inside an application. En un proyecto de MVC, los componentes lógicos como el modelo, el controlador y la vista se guardan en carpetas diferentes, y MVC usa las convenciones de nomenclatura para crear la relación entre estos componentes.In an MVC project, logical components like Model, Controller, and View are kept in different folders, and MVC uses naming conventions to create the relationship between these components. Para una aplicación grande, puede ser conveniente dividir la aplicación en distintas áreas de funciones de alto nivel.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Por ejemplo, una aplicación de comercio electrónico con varias unidades de negocio, como la finalización de la compra, la facturación, la búsqueda, etcétera. Cada una de estas unidades tiene sus propias vistas, controladores y modelos de componentes lógicos.For instance, an e-commerce app with multiple business units, such as checkout, billing, and search etc. Each of these units have their own logical component views, controllers, and models.

API webWeb APIs

Además de ser una plataforma excelente para crear sitios web, ASP.NET Core MVC es muy compatible con la creación de las API web.In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. Puede crear servicios que lleguen con facilidad a una amplia gama de clientes, incluidos exploradores y dispositivos móviles.You can build services that reach a broad range of clients including browsers and mobile devices.

El marco incluye compatibilidad con la negociación de contenido HTTP y compatibilidad integrada para aplicar formato a datos como JSON o XML.The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Escriba formateadores personalizados para agregar compatibilidad con sus propios formatos.Write custom formatters to add support for your own formats.

Use la generación de vínculos para habilitar la compatibilidad con hipermedios.Use link generation to enable support for hypermedia. Habilite fácilmente la compatibilidad con el uso compartido de recursos entre orígenes (CORS) para que las API web se pueden compartir entre varias aplicaciones web.Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

Capacidad de pruebaTestability

Al usar interfaces e inserción de dependencias, el marco es adecuado para realizar pruebas unitarias. También incluye características (por ejemplo, un proveedor TestHost e InMemory para Entity Framework) con las que resulta muy fácil y rápido realizar pruebas de integración.The framework's use of interfaces and dependency injection make it well-suited to unit testing, and the framework includes features (like a TestHost and InMemory provider for Entity Framework) that make integration tests quick and easy as well. Obtenga más información sobre cómo probar la lógica del controlador.Learn more about how to test controller logic.

Motor de vistas de RazorRazor view engine

Las vistas de ASP.NET Core MVC usan el motor de vistas de Razor para representar vistas.ASP.NET Core MVC views use the Razor view engine to render views. Razor es un lenguaje de marcado de plantillas compacto, expresivo y fluido para definir vistas que usan código incrustado de C#.Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razor se usa para generar dinámicamente contenido web en el servidor.Razor is used to dynamically generate web content on the server. Permite combinar de manera limpia el código del servidor con el código y el contenido del lado cliente.You can cleanly mix server code with client side content and code.

<ul>
  @for (int i = 0; i < 5; i++) {
    <li>List item @i</li>
  }
</ul>

Con el motor de vistas de Razor, puede definir diseños, vistas parciales y secciones reemplazables.Using the Razor view engine you can define layouts, partial views and replaceable sections.

Vistas fuertemente tipadasStrongly typed views

Las vistas de Razor en MVC pueden estar fuertemente tipadas en función del modelo.Razor views in MVC can be strongly typed based on your model. Los controladores pueden pasar un modelo fuertemente tipado a las vistas para que estas admitan IntelliSense y la comprobación de tipos.Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

Por ejemplo, en esta vista se representa un modelo de tipo IEnumerable<Product>:For example, the following view renders a model of type IEnumerable<Product>:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

Asistentes de etiquetasTag Helpers

Los asistentes de etiquetas permiten que el código del lado servidor participe en la creación y la representación de elementos HTML en archivos de Razor.Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. Puede usar asistentes de etiquetas para definir etiquetas personalizadas (por ejemplo, <environment>) o para modificar el comportamiento de etiquetas existentes (por ejemplo, <label>).You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). Los asistentes de etiquetas enlazan con elementos específicos, en función del nombre del elemento y sus atributos.Tag Helpers bind to specific elements based on the element name and its attributes. Proporcionan las ventajas de la representación del lado servidor, al tiempo que se mantiene una experiencia de edición HTML.They provide the benefits of server-side rendering while still preserving an HTML editing experience.

Hay muchos asistentes de etiquetas integradas para tareas comunes (como la creación de formularios, vínculos, carga de activos, etc.) y existen muchos más a disposición en repositorios públicos de GitHub y como paquetes NuGet.There are many built-in Tag Helpers for common tasks - such as creating forms, links, loading assets and more - and even more available in public GitHub repositories and as NuGet packages. Los asistentes de etiquetas se crean en C# y tienen como destino elementos HTML en función del nombre de elemento, el nombre de atributo o la etiqueta principal.Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Por ejemplo, la aplicación auxiliar de etiquetas integrada LinkTagHelper puede usarse para crear un vínculo a la acción Login de AccountsController:For example, the built-in LinkTagHelper can be used to create a link to the Login action of the AccountsController:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

La aplicación auxiliar de etiquetas EnvironmentTagHelper puede usarse para incluir distintos scripts en las vistas (por ejemplo, sin formato o reducida) según el entorno en tiempo de ejecución, como desarrollo, ensayo o producción:The EnvironmentTagHelper can be used to include different scripts in your views (for example, raw or minified) based on the runtime environment, such as Development, Staging, or Production:

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

Los asistentes de etiquetas ofrecen una experiencia de desarrollo compatible con HTML y un entorno de IntelliSense enriquecido para crear formato HTML y Razor.Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. La mayoría de los asistentes de etiquetas integrados tienen como destino elementos HTML existentes y proporcionan atributos del lado servidor para el elemento.Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

Componentes de vistaView Components

Los componentes de vista permiten empaquetar la lógica de representación y reutilizarla en toda la aplicación.View Components allow you to package rendering logic and reuse it throughout the application. Son similares a las vistas parciales, pero con lógica asociada.They're similar to partial views, but with associated logic.

Versión de compatibilidadCompatibility version

El método SetCompatibilityVersion permite a una aplicación participar o no en los cambios de comportamiento importantes incorporados en ASP.NET Core MVC 2.1 o una versión posterior.The SetCompatibilityVersion method allows an app to opt-in or opt-out of potentially breaking behavior changes introduced in ASP.NET Core MVC 2.1 or later.

Para obtener más información, vea Versión de compatibilidad para ASP.NET Core MVC.For more information, see Versión de compatibilidad para ASP.NET Core MVC.