ASP.NET MVC Core

30
24.01.2017 ASP.NET MVC Core

Transcript of ASP.NET MVC Core

Page 1: ASP.NET MVC Core

24.01.2017

ASP.NET MVC Core

Page 2: ASP.NET MVC Core

#NETCore2017

{ “title”: “Developer”, “awards”: [“mvp”], “twitter”: “@eiximenis”, “blog”: “http://geeks.ms/etomas” “work” : { “name”: “Plain Concepts”, “office”: “BCN”, “url”: “http://www.plainconcepts.com” }}

Eduard Tomàs

2

Page 3: ASP.NET MVC Core

#NETCore2017 3

• MVC Core mantiene el mismo modelo de desarrollo que MVC5• Vistas (Razor), Controladores, Acciones, Resultados de acción• Convenciones• Enrutamiento (tabla de rutas + enrutamiento por atributos)

• Si sabes MVC5 el salto inicial a MVC Core no es muy complejo• Misma filosofía

Lo que es (casi) igual(COMPARÁNDOLO CON MVC5, CLARO)

Page 4: ASP.NET MVC Core

#NETCore2017 4

• Razor Tag Helpers• Razor View Components• Unificación MVC – WebApi• Convenciones personalizadas

Algunas cosas que son distintas(Y LO QUE VEREMOS HOY)

Page 5: ASP.NET MVC Core

#NETCore2017 5

• MVC Core se alinea con las tendencias front modernas

• Directorio wwwroot donde se despliega la app• Ciclo de trabajo usando npm, gulp, bower, …

• Visual Studio 2015/2017 tiene gran soporte para esas herramientas

• Fácil uso con herramientas externas

La gran diferencia(Y LO QUE DEBERÍAS IR VIENDO INCLUSO EN MVC5)

Page 6: ASP.NET MVC Core

#NETCore2017 6

• Muchas de las diferencias son de ASP.NET Core, no de MVC Core:

• Seguridad• Logging• Gestión de errores• Configuración• …

MVC Core es un middleware core(¡SI CONOCES OWIN/KATANA ESTÁS DE SUERTE!)

Page 7: ASP.NET MVC Core

#NETCore2017 7

Los Tag Helpers son etiquetas Razor personalizadas que permiten encapsular código RazorParecidos a los helpers tradicionales, pero más potentes

Razor TAG HELPERSINTEGRANDO HELPERS CON MÁS FACILIDAD

Page 8: ASP.NET MVC Core

8

Demo: Creando un Tag Helper

Page 9: ASP.NET MVC Core

#NETCore2017 9

• Mayor integración con herramientas de diseño• Heredan de la clase TagHelper• Se pueden redefinir etiquetas HTML existentes• Una etiqueta HTML puede ser o no un Tag Helper en

función de sus atributos• Tienen conocimiento de su contenido

• Directiva @addTagHelper para importarlos

Razor Tag Helpers(LAS CLAVES)

Page 10: ASP.NET MVC Core

#NETCore2017 10

Formularios más clarosYA NO MÁS @HTML…. (CASI)

<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal"> <h4>Use a local account to log in.</h4> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-group"> <label asp-for="Email" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> </div> <div class="form-group"> <label asp-for="Password" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> </div> <p> <a asp-action="ForgotPassword">Forgot your password?</a> </p> </form>

Page 11: ASP.NET MVC Core

11

Demo: Tag Helper repeater

Page 12: ASP.NET MVC Core

#NETCore2017 12

Los view components son el equivalente a las acciones hijas de MVC5Invocadas desde RazorMuestran UI parcial con lógica de negocio

VIEW COMPONENTSYA NO MÁS ACCIONES HIJAS

Page 13: ASP.NET MVC Core

#NETCore2017 13

• Heredar de ViewComponent• Definir método Invoke (o InvokeAsync) que retorna

IViewComponentResult• Parámetros libres (método Invoke no es override).• Vista Default.cshml en

/Views/Shared/Components/<Componente>• Invocar desde Razor• @Component.Invoke(“nombre”, new {<parámetros>})

View Components(LAS CUATRO COSAS A SABER)

• Bonus 1.1: Invocar view component como tag helper

• <vc:nombre attr=“value” …></vc:nombre>

Page 14: ASP.NET MVC Core

14

Demo: View Components

Page 15: ASP.NET MVC Core

#NETCore2017 15

WebApi desaparece y se integra en MVC CoreNo más ApiController ni clases duplicadasEl model binding de MVC Core es una mezcla del de MVC5 y WebApi 2

MVC Y WEBAPI UNIFICADOS¡NO MÁS WEBAPI Y MVC!

Page 16: ASP.NET MVC Core

#NETCore2017 16

1. Si el controlador es un controlador de API:1. Un solo parámetro complejo con [FromBody]2. N parámetros simples que irán en URL

2. Si el controlador es un controlador de Web:1. Tantos parámetros simples o complejos como se

quiera2. No usar [FromBody]

Model binding unificado(LAS REGLAS PARA NEWBIES)

Page 17: ASP.NET MVC Core

17

Demo: Model Binding

Page 18: ASP.NET MVC Core

#NETCore2017 18

• El content-type de la petición determina el model binding a usar

• Usar application/x-www-form-urlencoded usa model binding a lo MVC

• Usar application/json o text/xml usa model binding a lo WebApi

• Otros content-types usarán el model binding especificado por el desarrollador

Model binding unificado(LAS CLAVES AVANZADAS)

Page 19: ASP.NET MVC Core

#NETCore2017 19

• Parámetros son leídos por value providers• Parámetros son enlazados por model binders• Un mismo parámetro puede ser enlazado múltiples veces• Un mismo parámetro puede ser enlazado desde URL o

desde el cuerpo de la petición• Se puede enlazar más de un parámetro desde la URL• Se puede enlazar más de un parámetro desde el cuerpo de

la petición

Model binding a lo MVC(LO QUE DEBEMOS SABER)

Page 20: ASP.NET MVC Core

#NETCore2017 20

• Parámetros de URL son leídos por value providers• Parámetros de URL son enlazados por model binders• Se puede enlazar más de un parámetro desde la URL• Un mismo parámetro de URL puede ser enlazado varias veces• Solo un parámetro puede ser enlazado desde el cuerpo de la

petición• Leído y enlazado a partir de un InputFormatter• El parámetro enlazado a partir del cuerpo de la petición debe

estar marcado con [FromBody]

Model binding a lo WebApi(LO QUE DEBEMOS SABER)

Page 21: ASP.NET MVC Core

21

Demo: Custom InputFormatter

Page 22: ASP.NET MVC Core

#NETCore2017 22

• Integrada en aquellos action results que heredan de ObjectResult

• Usa la cabecera Accept de la petición• Se puede forzar un formato con [Produces]• La respuesta es generada por un OutputFormatter

• Podemos crear OutputFormatters nuevos para dar soporte a nuevos formatos

Negociación de contenido(O COMO DARLE AL CLIENTE LO QUE PIDE)

Page 23: ASP.NET MVC Core

#NETCore2017 23

• Si no hay un OutputFormatter para el tipo especificado el fallback por defecto es JSON

• Se puede añadir el HttpNotAcceptableOutputFormatter que devolverá un 406

Negociación de contenido(UN PAR DE COSILLAS MÁS…)

services.AddMvc().Configure<MvcOptions>(options =>{    options.OutputFormatters.Insert(0, new HttpNotAcceptableOutputFormatter());}

Page 24: ASP.NET MVC Core

#NETCore2017 24

• En MVC5 / WebApi2 si se devolvía un null ese era serializado

Un poco más restful(DOS DETALLITOS…)

• En MVC Core eso devuelve un 204 (No Content)

• Las cadenas son devueltas usando text/plain

Page 25: ASP.NET MVC Core

#NETCore2017 25

• Podemos modificar las convenciones por defecto y agregar convenciones nuevas

• ¿Es buena idea modificar las convenciones? …• Habilita escenarios interesantes• Implementar IApplicationModelConvention

• Podemos agregar restricciones implementando IActionConstraintMetadata

Convenciones propias(UN GRAN PODER CONLLEVA UNA GRAN RESPONSABILIDAD)

Page 26: ASP.NET MVC Core

26

Demo: Convenciones propias

Page 27: ASP.NET MVC Core

#NETCore2017 27

• Empieza ya a usar npm, gulp y similares.• Olvida los bundles de MVC• Usa los IHttpResult de WebApi2. • Olvida el enrutado por verbo de WebApi.• Usa enrutado por atributos en WebApi.• Usa WebApi en modo OWIN.• Usa inyección de dependencias• Evita devolver datos desde MVC5. Usa WebApi.

De MVC5 a MVC Core(CONSEJOS BÁSICOS PARA AYUDARTE A DAR EL SALTO)

Page 28: ASP.NET MVC Core

#NETCore2017 28

• Sustituye Razor Helpers por Tag Helpers• Sustituye acciones hijas por View Components

• Elimina [FromUri] en ApiControllers y verifica los bindings

• Y por supuesto: Valora si vale la pena migrar. ¡Recuerda todo lo que no es realmente MVC Core pero sí ASP.NET Core!

De MVC5 a MVC Core(CONSEJOS BÁSICOS PARA AYUDARTE A DAR EL SALTO)

Page 29: ASP.NET MVC Core

¡GRACIAS!@eiximenis

[email protected]

Page 30: ASP.NET MVC Core

www.plainconcepts.com

MADRIDPaseo de la Castellana 163, 10º

28046 Madrid. EspañaT. (+34) 91 5346 836

BILBAONervión 3 , 6º

48001 Bilbao. EspañaT. (+34) 94 6008 168

BARCELONAAv. Josep Tarradellas 10, 6º 1ª

08029 Barcelona. EspañaT. (+34) 93 3607 114

SEVILLAAvenida de la innovación s/nEdificio Renta Sevilla, 3º A

41020 Sevilla. España

DUBAIDubai Internet City. Building 1

73030 Dubai. EAUT. (+971) 4 551 6653

LONDONImpact Hub Kings Cross24B York Way, N1 9AB

London. UK

SEATTLE1511, Third Ave

Seattle WA 98101. USAT. (+1) 206 708 1285