asp.net core 1.0 deep dive
TRANSCRIPT
#dotNetSpain2016
.NET Conference 2016Spain
Patrocinadores
Colaboradores
#dotNetSpain2016
#dotNetSpain2016
ConfiguraciónMVC6
Model BindingRoutingView ComponentsTag Helpers
Localización
Agenda
#dotNetSpain2016
Beer lover & makerEduard Tomàs
Proud fatherNerdy speaker
Compulsive DeveloperWorking @ Plain Concepts
¡Ojo!Los ejemplos están con rc1Es una RC… se supone que no habrá cambios en la RTM
¿O sí?
Configuración
#dotNetSpain2016
Múltiples OrígenesArchivos JSON, INI, XML, ...Argumentos de línea de comandosColecciones en memoria
Sensible al concepto de “entorno” (Dev, Prod, ...)
Configurable como pipeline
Configuración
#dotNetSpain2016
Es muy fácil tener configuración tipada en clases POCO
Se puede inyectar la configuración
Configuración
#dotNetSpain2016
Gestión de claves secretas (p. ej. Autenticación a servicios)
Las claves se guardan en local en cada máquina
Objetivo: Evitar subir claves a un repositorio
User Secrets
Talk is cheap…show me the code!
#dotNetSpain2016
”” 1. Configuración
tipada2. Varios entornos
Model Binding
#dotNetSpain2016
Mezcla del model binding existente en MVC5 y WebApi 2
Usando x-www-form-urlencoded tenemos el binding de MVC5
Usando otro content-type tenemos un binding parecido al de WebApi 2
Model Binding
#dotNetSpain2016
Value Providers recogen datos de la peticiónNo están asignados a verbo HTTP.
Model binders, enlazan los datos a los parámetros
Guardados en diccionario <Type, IModelBinder>
Binding por defecto para parámetros, sean simples o complejos
Binding “a lo MVC”
#dotNetSpain2016
Se aplica al único posible parámetro [FromBody]
Basado en formatters de entrada (IInputFormatter)
Cada formatter lee de un content-type especifico. OOB vienen:JsonInputFormatter – application/jsonXmlSerializerInputFormatter – application/xml (no registrado por defecto)XmlDataContractSerializerInputFormatter – application/xml
Binding “a lo WebApi”
#dotNetSpain2016
No todas los IActionResult aplican content-negotation
Deben heredar de ObjectResultSi se devuelve un tipo T que no sea un IActionResult el framework lo “envuelve” en un ObjectResult<T>
Basado en formatters de salida (IOutputFormatter)Atributo [Produces]
Content-Negotation
#dotNetSpain2016
Generan la salida en función del tipo de datos que espera el cliente
Invocados por los ActionResult de negociación de contenido
Si no hay un formatter que pueda devolver el tipo de datos, el fallback es JSON
Output Formatters
services.AddMvc().Configure<MvcOptions>(options =>{ options.OutputFormatters.Insert(0, new HttpNotAcceptableOutputFormatter());}
#dotNetSpain2016
– JsonOutputFormatter– XmlSerializerOutputFormatter – No registrado por defecto– XmlDataContractSerializerOutputFormatter– TextPlainFormatter (cadenas a text/plain)– HttpNoContentOutputFormatter (null a 204)– HttpNotAcceptableOutputFormatter – (406 si no hay formatter)
OutputFormatters
Talk is cheap…show me the code!
#dotNetSpain2016
”” 1. Demos de binding
2. Custom model binder
Routing
#dotNetSpain2016
En MVC5 y WebApi 2 hay dos tipos de Routing
Convention based (tabla de rutas centralizada)Convenciones distintas entre MVC5 y WebApi
Attribute based (basada en atributos)
En MVC6 existen esos dos mismos tiposRutas por atributo soportan [controller] y [action]
(Se refieren al controlador y acción actual)
Atributos a nivel de controlador y a nivel de acción
Routing
#dotNetSpain2016
Route constraintsParámetros opcionalesParámetros con valor por defectoParámetros tipados
Routing
#dotNetSpain2016
Los routers implementan IRouterCada router indica si puede procesar la petición (IsHandled)Routers built-in
TemplateRouteRouteCollection
Método extensión useRouter permite indicar un router a usar
MapRoute añade una TemplateRoute con el MvcDefaultHandler interno
Custom routers
Talk is cheap…show me the code!
#dotNetSpain2016
”” 1. Uso de IRoutes
2. Custom IRoute
#dotNetSpain2016
IApplicationModelConventionInterfaz definitivo para personalitzar como funciona MVC6... Y potencialmente romper otras cosas por el camino
Interfaz con un solo método (Apply). Dentro de este método recibimos un ApplicationModel con la información que usa MVC6 para modelizar la aplicación
Ejemplo: Podríamos crear una convención que enrute los métodos que empiecen por PostXXX usando... POST
Exacto! Enrutamiento a lo WebApi clásico ;-)
Un paso más...
#dotNetSpain2016
Elemento de ApplicationModel que especifica requerimientos para que una acción sea válida.
Eso permite tener más de una acción bajo la misma ruta y usar otros elementos de la petición para seleccionar la acción final
Se aplican con atributos
IActionConstraintMetadata
Talk is cheap…show me the code!
#dotNetSpain2016
”” 1. Convenciones
personalizadas
2. Constraints de acciones
View Components
#dotNetSpain2016
Reemplazan a las vistas parciales de MVC5Puede verse un View Component como un “pequeño controlador”El VC tiene una única responsabilidad: devolver la vista parcial
Separación de responsabilidadesNo es necesario “hinchar” un controlador existente
View Components
#dotNetSpain2016
View ComponentsClase que herede de ViewComponentOpcional: Atributo [ViewComponent] para especificar nombre
Declarar método IViewComponentResult Invoke(…)
Crear la vista associadaEn /Views/Shared/<ViewComponent>/
Uso: @Component(“nombre”).Invoke(...)
Tag Helpers
#dotNetSpain2016
Permiten que una “etiqueta HTML” en una vista de Razor sea procesada en servidor
No son Web ControlsSustituyen a los helpers clásicos de Razor
Permiten una mayor integración con herramientas
Tag Helpers
#dotNetSpain2016
Heredar de TagHelper
Decorar con [HtmlTargetElement] indicando qué atributos y qué tag son respondidos por el TagHelper
Redefinir el método Process
Creación de Tag Helpers
#dotNetSpain2016
La directiva addTagHelper “clase, assembly” importa el TagHelper indicado del ensamblado correspondiente
VS2015 incluye en _ViewImports.cshtml el código para importar todos los TagHelpers de MVC6 en todas las vistas:
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
Importar Tag Helpers
#dotNetSpain2016
Si un TagHelper es importado se ejecutará en todas las etiquetas HTML que coincidan con la etiqueta declarada en [HtmlTargetElement] siempre y cuando contengan algunos de los atributos declarados
Podemos preceder el nombre del tag con ! para indicar a Razor que no queremos que se procese el TagHelper
Podemos usar @tagHelperPrefix “prefijo” para forzar un prefijo para todos los TagHelpers.
Ejecución “selectiva” de Tag Helpers
Localización
#dotNetSpain2016
Nuevo middleware de localización
Soporta distintas fuentes (.resx, bbdd, ficheros texto)
Permite que el selector de cultura esté en headers (Accept-Language), en URL (query string) o en cookie
O en cualquier otro sitio que nosotros definamos
Localización
#dotNetSpain2016
Objetos IRequestCultureProviders indican qué cultura utilizar a partir de los datos de la request
ObjetosIStringLocalizerFactory, IStringLocalizer para acceder a los recursos traducidos en las distintas fuentesIHtmlLocalizerFactory, IHtmlLocalizer ofrecen una API para acceder a los recursos traducidos para MVCIViewLocalizer es un IHtmlLocalizer especifico para la vista deseada
Localización
Q&A
#dotNetSpain2016
http://aka.ms/DOTNETT1S4
No olvides realizar la encuesta¡Gracias!
#dotNetSpain2016
Eduard TomàsCompulsive [email protected]@eiximenis http://aka.ms/DOTNETT1S4