asp-net-mvc-es.pdf

Descripción completa

Views 633 Downloads 90 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Citation preview

asp.net-mvc

#asp.netmvc

Tabla de contenido Acerca de

1

Capítulo 1: Empezando con asp.net-mvc

2

Observaciones

2

Versiones

2

Examples

3

Hola MVC!

Capítulo 2: ActionResult

3

6

Observaciones

6

Examples

6

Regresar una página de visualización

6

Devolver un archivo

6

Devuelve un json

7

Capítulo 3: ActionResult Examples

8 8

Ver resultado

8

PartialViewResult

8

RedirectResult

9

RedirectToRouteResult

9

ContentResult

10

JsonResult

10

Capítulo 4: ActionResult

12

Sintaxis

12

Examples

12

Métodos de acción

12

Asignación de parámetros de acción-método

13

Llamando a un ActionResult en otro ActionResult

13

Capítulo 5: Anotaciones de datos

14

Introducción

14

Examples

14

Atributos básicos de validación utilizados en ViewModel

14

Modelo

14

Ver

14

Controlador

15

Validación remota

Validación remota utilizada para verificar si el contenido que se ingresa en el control de

15

15

RequiredAttribute

17

StringLengthAttribute

17

Atributo de rango

18

Atributo de expresión regular

18

Comparar atributo

19

Atributo de validación personalizado

20

Aquí está su DotNetFiddle Demo

21

Modelo EDMx - Anotación de datos

21

Anotaciones de datos para la primera implementación de la base de datos (código de modelo

22

Capítulo 6: Áreas

24

Introducción

24

Observaciones

24

Examples

24

Crear una nueva área

24

Configurar RouteConfig.cs

24

Cree un nuevo controlador y configure areanameAreaRegistration.cs maproute

24

Capítulo 7: Asp.net mvc enviar correo Examples

26 26

Formulario de contacto en Asp MVC

26

Enviando correo electrónico desde la clase

27

Capítulo 8: Ayudantes html

29

Introducción

29

Examples

29

Ayudante HTML personalizado - Nombre para mostrar

29

Ayudante personalizado - botón Enviar de envío

29

Lista exhaustiva de ejemplos de HtmlHelper que incluye salida HTML

30

HtmlHelper.Action()

30

HtmlHelper.ActionLink()

30

@HtmlHelper.BeginForm()

30

Ayudantes HTML estándar con sus salidas HTML

30

Ayudante personalizado - Botón de radio renderizado con etiqueta

31

Ayudante personalizado - Selector de fecha y hora

32

Capítulo 9: Dockerización de la aplicación ASP.NET Examples

33 33

Dockerfile y Nuget

33

Soporte POSTGRESQL.

33

Dockerización

34

Capítulo 10: Empaquetado y Minificación Examples Minificación

36 36 36

Ejemplo usando minificación

36

Guiones y paquetes de estilo

36

Capítulo 11: Enrutamiento

38

Introducción

38

Examples

38

Enrutamiento personalizado

38

Añadiendo ruta personalizada en mvc

39

Atributo de enrutamiento en MVC

39

Conceptos básicos de enrutamiento

40

Ruta de todo

41

Ruta completa para habilitar el enrutamiento del lado del cliente

42

Atributo de enrutamiento en áreas

42

Capítulo 12: Extensiones Ajax MVC

44

Introducción

44

Parámetros

44

Observaciones

45

Examples

45

Ajax Action Link

45

Formas de Ajax

45

Capítulo 13: Filtros de accion Examples

46 46

Un filtro de acción de registro.

46

Filtro de acción de Control de sesión - solicitud de página y ajax

46

Ubicaciones de uso del filtro de acción (global, controlador, acción)

47

Atributo de manejador de excepciones

49

Capítulo 14: Html.AntiForgeryToken

51

Introducción

51

Sintaxis

51

Observaciones

51

Precaución

51

Examples

51

Uso básico

51

Maquinilla de afeitar (YourView.cshtml)

51

Controlador (YourController.cs)

52

Deshabilitar el control heurístico de identidad

52

Validando todas las publicaciones

52

Uso anticipado: aplique el filtro antiforgery predeterminado para cada POST

54

Uso de AntiForgeryToken con la solicitud de Ajax de Jquery

55

Capítulo 15: Html.RouteLink

56

Parámetros

56

Examples

56

Ejemplo básico usando el texto de enlace y el nombre de la ruta

Capítulo 16: Inyección de dependencia

56

57

Observaciones

57

Examples

58

Configuraciones de Ninject

58

Utilización de las interfaces.

59

Inyección de dependencia del constructor

60

Dependencia codificada

60

parámetro DI

60

Inyección De la Dependencia De Ninject

60

Capítulo 17: jQuery Ajax Call Con Asp MVC Examples Publicar objetos JavaScript con jQuery Ajax Call

Capítulo 18: Manejo de errores Http

65 65 65

67

Introducción

67

Examples

67

Configuración básica

Capítulo 19: Maquinilla de afeitar

67

69

Introducción

69

Sintaxis

69

Observaciones

69

Examples

69

Añadir comentarios

69

Mostrar HTML dentro del bloque de código Razor

70

Sintaxis basica

71

Escapando a @ personaje

72

Crear clases y métodos en línea usando funciones @

72

Agregando un atributo personalizado con - (guión) en el nombre

73

Plantillas de editor

73

Pase el contenido de Razor a un @helper

75

Compartir @helpers a través de vistas

75

Capítulo 20: Modelo de enlace

77

Introducción

77

Observaciones

77

Examples

77

Enlace de valor de ruta

77

Enlace de cadena de consulta

77

Atadura a objetos

78

Ajax vinculante

78

Generic, enlace basado en modelo de sesión

78

Prevenir el enlace en PostModel

80

Subir archivo

81

Validación de campos de fecha manualmente con formatos dinámicos utilizando el cuaderno de

Capítulo 21: Modelo de validación Examples

81

83 83

Validar modelo en ActionResult

83

Eliminar un objeto de la validación

83

Mensajes de error personalizados

84

Creando mensajes de error personalizados en el modelo y en el controlador

84

Validación de modelos en JQuery.

85

Capítulo 22: MVC vs Formularios Web

87

Introducción

87

Sintaxis

87

Observaciones

87

Examples

87

Ventajas de los formularios web ASP .NET

87

Ventajas de una aplicación web basada en MVC

88

Desventajas

88

Razor View Engine VS ASPX View Engine

88

Capítulo 23: Operación CRUD

90

Introducción

90

Observaciones

90

Examples

90

Crear - Parte del controlador

90

Crear - Ver parte

91

Detalles - parte del controlador

92

Detalles - Ver parte

93

Editar - parte del controlador

94

Eliminar - parte del controlador

95

Capítulo 24: Plantillas de visualización y editor

97

Introducción

97

Examples

97

Plantilla de pantalla

97

Plantilla de editor

98

Capítulo 25: Registro de errores Examples

101 101

Atributo simple

101

devolviendo página de error personalizada

101

Cree un ErrorLogger personalizado en ASP.Net MVC

102

Capítulo 26: Reglas de reescritura de IIS Examples Forzar HTTPS usando la regla de reescritura

Capítulo 27: T4MVC

105 105 105

106

Introducción

106

Examples

106

Llamando a una acción

Capítulo 28: Usando múltiples modelos en una vista

106

109

Introducción

109

Examples

109

Uso de múltiples modelos en una vista con ExpandoObject dinámico

Capítulo 29: Validación automática del lado del cliente a partir de atributos

109

112

Observaciones

112

Examples

112

Modelo

112

configuración de web.config

112

Paquetes Nuget Requeridos

112

Vista de formulario

112

Configuración del paquete

113

Global.asax.cs

114

Capítulo 30: ViewData, ViewBag, TempData

115

Introducción

115

Sintaxis

115

Examples

115

¿Qué son ViewData, ViewBag y TempData?

115

Ciclo de vida de TempData

117

Capítulo 31: Vistas parciales

119

Introducción

119

Sintaxis

119

Examples

119

Vista parcial con modelo.

119

Vista parcial a una cadena - para contenido de correo electrónico, etc.

119

Html.Partial Vs Html.RenderPartial

120

Capítulo 32: Web.config cifrado Examples Cómo proteger su archivo web.config

Creditos

122 122 122

123

Acerca de You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: asp-net-mvc It is an unofficial and free asp.net-mvc ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official asp.net-mvc. The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners. Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/es/home

1

Capítulo 1: Empezando con asp.net-mvc Observaciones El patrón arquitectónico Modelo-Vista-Controlador (MVC) separa una aplicación en tres componentes principales: el modelo, la vista y el controlador. El marco MVC de ASP.NET proporciona una alternativa al patrón de formularios web de ASP.NET para crear aplicaciones web. El marco de ASP.NET MVC es un marco de presentación ligero y altamente comprobable que (al igual que con las aplicaciones basadas en Web Forms) se integra con las características existentes de ASP.NET, como las páginas maestras y la autenticación basada en membresía. El marco MVC se define en el ensamblado System.Web.Mvc. El marco MVC incluye los siguientes componentes: • Modelos Los objetos modelo son las partes de la aplicación que implementan la lógica para el dominio de datos de la aplicación. A menudo, los objetos del modelo recuperan y almacenan el estado del modelo en una base de datos. Por ejemplo, un objeto Producto podría recuperar información de una base de datos, operar en ella y luego escribir información actualizada en una tabla de Productos en una base de datos de SQL Server. En aplicaciones pequeñas, el modelo es a menudo una separación conceptual en lugar de una física. Por ejemplo, si la aplicación solo lee un conjunto de datos y lo envía a la vista, la aplicación no tiene una capa de modelo físico y clases asociadas. En ese caso, el conjunto de datos asume el rol de un objeto modelo. • Vistas . Las vistas son los componentes que muestran la interfaz de usuario (UI) de la aplicación. Normalmente, esta IU se crea a partir de los datos del modelo. Un ejemplo sería una vista de edición de una tabla de Productos que muestra cuadros de texto, listas desplegables y cuadros de verificación según el estado actual de un objeto Producto. • Controladores Los controladores son los componentes que controlan la interacción del usuario, trabajan con el modelo y, en última instancia, seleccionan una vista para representar que muestra la interfaz de usuario. En una aplicación MVC, la vista solo muestra información; El controlador maneja y responde a la entrada e interacción del usuario. Por ejemplo, el controlador maneja los valores de cadena de consulta y pasa estos valores al modelo, que a su vez podría usar estos valores para consultar la base de datos.

Versiones Versión

Versión .NET

Fecha de lanzamiento

MVC 1.0

.NET 3.5

2009-03-13

MVC 2.0

.NET 3.5 / 4.0

2010-03-10

MVC 3.0

.NET 4.0

2011-01-13

MVC 4.0

.NET 4.0 / 4.5

2012-08-15

https://riptutorial.com/es/home

2

Versión

Versión .NET

Fecha de lanzamiento

MVC 5.0

.NET 4.5

2013-10-17

MVC 5.1

.NET 4.5

2014-01-17

MVC 5.2

.NET 4.5

2014-08-28

MVC 6.0

.NET 4.5

2015-11-18

Core MVC 1.0

.NET 4.5

2016-07-12

Core MVC 1.1

.NET 4.5

2016-11-18

Examples Hola MVC! ASP.NET MVC es un framework de aplicaciones web de código abierto. MVC en sí es un patrón de diseño que se basa en tres componentes principales: model-view-controller . Modelo : los modelos reflejan los objetos de su negocio y son un medio para pasar datos entre controladores y vistas. Vista : las vistas son las páginas que representan y muestran los datos del modelo al usuario. Las vistas de ASP.NET MVC se escriben normalmente utilizando la sintaxis de Razor. Controlador : los controladores manejan las solicitudes HTTP entrantes de un cliente y, por lo general, devuelven uno o más modelos a una vista apropiada. Las características de ASP.NET MVC: 1. Ideal para desarrollar aplicaciones complejas pero ligeras. 2. Proporciona un marco extensible y conectable que se puede reemplazar y personalizar fácilmente. Por ejemplo, si no desea utilizar el motor de visualización Razor o ASPX integrado, puede utilizar cualquier otro motor de visualización de terceros o incluso personalizar los existentes. 3. Utiliza el diseño basado en componentes de la aplicación al dividirla lógicamente en los componentes Modelo, Vista y Controlador. Esto permite a los desarrolladores gestionar la complejidad de los proyectos a gran escala y trabajar en componentes individuales. 4. La estructura MVC mejora el desarrollo basado en pruebas y la capacidad de prueba de la aplicación, ya que todos los componentes pueden diseñarse en función de la interfaz y probarse utilizando objetos simulados. Por lo tanto, ASP.NET MVC Framework es ideal para proyectos con un gran equipo de desarrolladores web. 5. Admite todas las funciones vastas de ASP.NET, como Autorización y autenticación, Páginas maestras, Enlace de datos, Controles de usuario, Membresías, Enrutamiento de ASP.NET, etc. 6. No utiliza el concepto de estado de vista (que está presente en ASP.NET). Esto ayuda en la

https://riptutorial.com/es/home

3

creación de aplicaciones que son ligeras y dan control total a los desarrolladores. Aplicación MVC simple Vamos a crear una aplicación MVC simple que muestra detalles personales. Crea un nuevo proyecto MVC usando Visual Studio. Agregue un nuevo modelo llamado Person a la carpeta de modelos como sigue: public class Person { public string Surname { get; set; } public string FirstName { get; set; } public string Patronymic { get; set; } public DateTime BirthDate { get; set; } }

Agregar un nuevo controlador a la carpeta Controladores: public class HomeController : Controller { //Action Method public ActionResult Index() { // Initialize model Person person = new Person { Surname = "Person_SURNAME", FirstName = "Person_FIRSTNAME", Patronymic = "Person_PATRONYMIC", BirthDate = new DateTime(1990, 1, 1) }; // Send model to View for displaying to user return View(person); } }

Finalmente, agregue Ver a / Vistas / Inicio / carpeta llamada Index.cshtml : @* Model for this view is Person *@ @model Hello_MVC.Models.Person Hello @Model.FirstName !

Details:

@Html.LabelFor(m => m.Surname) @Html.DisplayFor(m => m.Surname)

@Html.LabelFor(m => m.FirstName) @Html.DisplayFor(m => m.FirstName)

@Html.LabelFor(m => m.Patronymic) @Html.DisplayFor(m => m.Patronymic)

https://riptutorial.com/es/home

4



@Html.LabelFor(m => m.BirthDate) @Html.DisplayFor(m => m.BirthDate)

Lea Empezando con asp.net-mvc en línea: https://riptutorial.com/es/asp-netmvc/topic/769/empezando-con-asp-net-mvc

https://riptutorial.com/es/home

5

Capítulo 2: ActionResult Observaciones Un ActionResult es el mejor punto de vista como un punto final web en MVC. Se puede acceder al método Ever ActionResult escribiendo la dirección web adecuada según lo configurado por su motor de enrutamiento.

Examples Regresar una página de visualización Este ActionResult devuelve una página de vista de Razor. Bajo la plantilla de enrutamiento estándar, este método ActionResult se alcanzaría en http: // localhost / about / me La vista se buscará automáticamente en su sitio en ~/Views/About/Me.cshtml public class AboutController : Controller { public ActionResult Me() { return View(); } }

Devolver un archivo Un ActionResult puede devolver FileContentResult especificando la ruta del archivo y el tipo de archivo según la definición de extensión, conocido como tipo MIME. El tipo MIME se puede configurar automáticamente según el tipo de archivo usando el método GetMimeMapping , o se puede definir manualmente en el formato adecuado, por ejemplo, "texto / plano". Como FileContentResult requiere que se FileContentResult una matriz de bytes como una secuencia de archivos, System.IO.File.ReadAllBytes se puede usar para leer el contenido de los archivos como una matriz de bytes antes de enviar el archivo solicitado. public class FileController : Controller { public ActionResult DownloadFile(String fileName) { String file = Server.MapPath("~/ParentDir/ChildDir" + fileName); String mimeType = MimeMapping.GetMimeMapping(path); byte[] stream = System.IO.File.ReadAllBytes(file); return File(stream, mimeType); } }

https://riptutorial.com/es/home

6

Devuelve un json El resultado de la acción puede devolver Json. 1. Devolviendo a Json para transmitir json en ActionResult public class HomeController : Controller { public ActionResult HelloJson() { return Json(new {message1="Hello", message2 ="World"}); } }

2. Devolver contenido para transmitir json en ActionResult public class HomeController : Controller { public ActionResult HelloJson() { return Content("Hello World", "application/json"); } }

Lea ActionResult en línea: https://riptutorial.com/es/asp-net-mvc/topic/6246/actionresult

https://riptutorial.com/es/home

7

Capítulo 3: ActionResult Examples Ver resultado public ActionResult Index() { // Renders a view as a Web page. return View(); }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public ViewResult Index() { // Renders a view as a Web page. return View(); }

PartialViewResult public ActionResult PopulateFoods() { IEnumerable foodList = GetAll(); // Renders a partial view, which defines a section of a view that can be rendered inside another view. return PartialView("_foodTable", foodVms);; }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public PartialViewResult PopulateFoods() { IEnumerable foodList = GetAll(); // Renders a partial view, which defines a section of a view that can be rendered inside another view.

https://riptutorial.com/es/home

8

return PartialView("_foodTable", foodVms); }

RedirectResult public ActionResult Index() { //Redirects to another action method by using its URL. return new RedirectResult("http://www.google.com"); }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public RedirectResult Index() { //Redirects to another action method by using its URL. return new RedirectResult("http://www.google.com"); }

RedirectToRouteResult public ActionResult PopulateFoods() { // Redirects to another action method. In this case the index method return RedirectToAction("Index"); }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public RedirectToRouteResult PopulateFoods() { // Redirects to another action method. In this case the index method return RedirectToAction("Index"); }

En caso de que desee redirigir a otra acción con un parámetro, puede usar la sobrecarga RedirectToAction : public ActionResult SomeActionWithParameterFromThisController(string parameterName) { // Some logic

https://riptutorial.com/es/home

9

} ..................... ..................... ..................... return RedirectToAction("SomeActionWithParameterFromThisController", new { parameterName = parameter });

ContentResult public ActionResult Hello() { // Returns a user-defined content type, in this case a string. return Content("hello world!"); }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public ContentResult Hello() { // Returns a user-defined content type, in this case a string. return Content("hello world!"); }

Puede saber más sobre esto aquí: Asp.Net Mvc: ContentResult vs. string

JsonResult public ActionResult LoadPage() { Student result = getFirst(); //Returns a serialized JSON object. return Json(result, JsonRequestBehavior.AllowGet); }

Los métodos de acción generalmente devuelven un resultado que se conoce como un resultado de acción. La clase ActionResult es la clase base para todos los resultados de acción. El ActionInvoker decide qué tipo de resultado de acción devolver según la tarea que realiza el método de acción. Es posible ser explícito sobre qué tipo devolver, pero generalmente no es necesario. public JsonResult LoadPage() { Student result = getFirst(); //Returns a serialized JSON object.

https://riptutorial.com/es/home

10

return Json(result, JsonRequestBehavior.AllowGet); }

Lea ActionResult en línea: https://riptutorial.com/es/asp-net-mvc/topic/6487/actionresult

https://riptutorial.com/es/home

11

Capítulo 4: ActionResult Sintaxis • // El método ActionResult devuelve una instancia que deriva de ActionResult. Puede crear un método de acción que puede devolver cualquier instancia que esté ajustada en el tipo de ActionResult apropiado. • // Los tipos de retorno de ActionResult incorporados son: • Ver(); // ViewResult renderiza una vista como una página web • Vista parcial(); // PartialViewResult presenta una vista parcial, que se puede utilizar como parte de otra vista. • Redirigir (); // RedirectResult redirige a otro método de acción utilizando su URL. • RediectToAction (); RedirectToRoute (); // RedirectToRouteResult redirige a otro método de acción. • Contenido(); // ContentResult devuelve un tipo de contenido definido por el usuario. • Json (); // JsonResult devuelve un objeto JSON serializado. • JavaScript (); // JavaScriptResult devuelve un script que puede ejecutarse en el lado del cliente. • Expediente(); // FileResult devuelve una salida binaria para escribir en la respuesta. • // EmptResult representa un valor de retorno que se utiliza si el método de acción debe devolver un resultado nulo.

Examples Métodos de acción Cuando el usuario ingresa una URL, por ejemplo: http://examplewebsite.com/Example/HelloWorld , la aplicación MVC usará las reglas de enrutamiento para analizar esta URL y extraer la ruta secundaria, que determinará el controlador, la acción y los posibles parámetros. Para la url anterior, el resultado será / Example / HelloWorld, que, de manera predeterminada, los resultados de las reglas de enrutamiento proporcionan el nombre del controlador: Ejemplo y el nombre de la acción: HelloWorld. public class ExampleController: Controller { public ActionResult HelloWorld() {

https://riptutorial.com/es/home

12

ViewData["ExampleData"] = "Hello world!"; return View(); } }

El método ActionResult anterior "HelloWorld" representará la vista llamada HelloWorld, donde luego podemos usar los datos de ViewData.

Asignación de parámetros de acción-método Si hubiera otro valor en la URL como: / Example / ProcessInput / 2, las reglas de enrutamiento amenazarán el último número como un parámetro pasado a la acción ProcessInput del controlador Ejemplo. public ActionResult ProcessInput(int number) { ViewData["OutputMessage"] = string.format("The number you entered is: {0}", number); return View(); }

Llamando a un ActionResult en otro ActionResult Podemos llamar a un resultado de acción en otro resultado de acción. public ActionResult Action1() { ViewData["OutputMessage"] = "Hello World"; return RedirectToAction("Action2","ControllerName"); //this will go to second action; }

public ActionResult Action2() { return View(); //this will go to Action2.cshtml as default; }

Lea ActionResult en línea: https://riptutorial.com/es/asp-net-mvc/topic/6635/actionresult

https://riptutorial.com/es/home

13

Capítulo 5: Anotaciones de datos Introducción Podemos agregar validaciones a nuestra aplicación al agregar Anotaciones de datos a nuestras clases modelo. Las anotaciones de datos nos permiten describir las reglas que queremos que se apliquen a las propiedades de nuestro modelo, y ASP.NET MVC se encargará de hacerlas cumplir y mostrar los mensajes apropiados a los usuarios.

Examples Atributos básicos de validación utilizados en ViewModel

Modelo using System.ComponentModel.DataAnnotations; public class ViewModel { [Required(ErrorMessage="Name is required")] public string Name { get; set; } [StringLength(14, MinimumLength = 14, ErrorMessage = "Invalid Phone Number")] [Required(ErrorMessage="Phone Number is required")] public string PhoneNo { get; set; } [Range(typeof(decimal), "0", "150")] public decimal? Age { get; set; } [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip Code.")] public string ZipCode {get;set;} [EmailAddress(ErrorMessage = "Invalid Email Address")] public string Email { get; set; } [Editable(false)] public string Address{ get; set; } }

Ver // Include Jquery and Unobstructive Js here for client side validation @using (Html.BeginForm("Index","Home") { @Html.TextBoxFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) @Html.TextBoxFor(model => model.PhoneNo) @Html.ValidationMessageFor(model => model.PhoneNo)

https://riptutorial.com/es/home

14

@Html.TextBoxFor(model => model.Age) @Html.ValidationMessageFor(model => model.Age) @Html.TextBoxFor(model => model.ZipCode) @Html.ValidationMessageFor(model => model.ZipCode) @Html.TextBoxFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email) @Html.TextBoxFor(model => model.Address) @Html.ValidationMessageFor(model => model.Address)

}

Controlador public ActionResult Index(ViewModel _Model) { // Checking whether the Form posted is valid one. if(ModelState.IsValid) { // your model is valid here. // perform any actions you need to, like database actions, // and/or redirecting to other controllers and actions. } else { // redirect to same action return View(_Model); } }

Validación remota

Validación remota utilizada para verificar si el contenido que se ingresa en el control de entrada es válido o no, enviando una solicitud ajax al lado del servidor para verificarlo. Trabajando funciona al realizar una llamada AJAX desde el cliente a una acción del controlador con el valor del campo que se está validando. La acción del controlador luego devuelve una respuesta JsonResult indica el éxito o el fracaso de la validación. Devolviendo true de su acción indica que la validación pasó. Cualquier otro valor indica falla. Si devuelve false , se utiliza el mensaje de error especificado en el atributo. Si devuelve algo más, como una cadena o incluso un entero, se mostrará como el mensaje de error. A menos que necesite que su mensaje de error sea dinámico, tiene sentido devolver verdadero o falso y dejar que el validador use el mensaje de error especificado en el atributo. RemoteAttribute

https://riptutorial.com/es/home

15

ViewModel public class ViewModel { [Remote("IsEmailAvailable", "Group", HttpMethod = "POST", ErrorMessage = "Email already exists. Please enter a different email address.")] public string Email{ get; set; } }

Controlador [HttpPost] public JsonResult IsEmailAvailable(string Email) { // Logic to check whether email is already registered or Not. var emailExists = IsEmailRegistered(); return Json(!emailExists); }

Live Demo Fiddle Puede pasar propiedades adicionales del modelo al método del controlador utilizando la propiedad AdditionalFields de RemoteAttribute . Un escenario típico sería pasar la propiedad de ID del modelo en forma de 'Editar', de modo que la lógica del controlador pueda ignorar los valores del registro existente. Modelo public int? ID { get; set; } [Display(Name = "Email address")] [DataType(DataType.EmailAddress)] [Required(ErrorMessage = "Please enter you email address")] [Remote("IsEmailAvailable", HttpMethod="Post", AdditionalFields="ID", ErrorMessage = "Email already exists. Please enter a different email address.")] public string Email { get; set; }

Controlador [HttpPost] public ActionResult Validate(string email, int? id) { if (id.HasValue) { return Json(!db.Users.Any(x => x.Email == email && x.ID != id); } else { return Json(!db.Users.Any(x => x.Email == email); } }

Demostración de trabajo - Campos adicionales Nota adicional https://riptutorial.com/es/home

16

El mensaje de error predeterminado es comprensiblemente vago, por lo que siempre recuerde anular el mensaje de error predeterminado cuando use el RemoteAttribute .

RequiredAttribute El atributo Required especifica que una propiedad es requerida. Se puede especificar un mensaje de error al usar la propiedad ErrorMessage en el atributo. Primero agregue el espacio de nombres: using System.ComponentModel.DataAnnotations;

Y aplicar el atributo en una propiedad. public class Product { [Required(ErrorMessage = "The product name is required.")] public string Name { get; set; } [Required(ErrorMessage = "The product description is required.")] public string Description { get; set; } }

También es posible utilizar recursos en el mensaje de error para aplicaciones globalizadas. En este caso, el ErrorMessageResourceName debe especificarse con la clave de recurso de la clase de recurso (archivo resx ) que debe ErrorMessageResourceType en el ErrorMessageResourceType : public class Product { [Required(ErrorMessageResourceName = "ProductNameRequired", ErrorMessageResourceType = typeof(ResourceClass))] public string Name { get; set; } [Required(ErrorMessageResourceName = "ProductDescriptionRequired", ErrorMessageResourceType = typeof(ResourceClass))] public string Description { get; set; } }

StringLengthAttribute El atributo StringLength especifica la longitud mínima y máxima de los caracteres permitidos en un campo de datos. Este atributo se puede aplicar en propiedades, campos públicos y parámetros. El mensaje de error se debe especificar en la propiedad ErrorMessage en el atributo. Las propiedades MinimumLength y MaximumLength especifican el mínimo y el máximo respectivamente. Primero agregue el espacio de nombres: using System.ComponentModel.DataAnnotations;

Y aplicar el atributo en una propiedad.

https://riptutorial.com/es/home

17

public class User { // set the maximum [StringLength(20, ErrorMessage = "The username cannot exceed 20 characters. ")] public string Username { get; set; } [StringLength(MinimumLength = 3, MaximumLength = 16, ErrorMessage = "The password must have between 3 and 16 characters.")] public string Password { get; set; } }

También es posible utilizar recursos en el mensaje de error para aplicaciones globalizadas. En este caso, el ErrorMessageResourceName debe especificarse con la clave de recurso de la clase de recurso (archivo resx ) que debe ErrorMessageResourceType en el ErrorMessageResourceType : public class User { [StringLength(20, ErrorMessageResourceName = "StringLength", ErrorMessageResourceType = typeof(ResoucesKeys))] public string Username { get; set; } [StringLength(MinimumLength = 3, MaximumLength = 16, ErrorMessageResourceName = "StringLength", ErrorMessageResourceType = typeof(ResoucesKeys))] public string Password { get; set; } }

Atributo de rango El atributo Range puede decorar cualquier propiedad o campo público y especifica un rango en el que un campo numérico debe estar entre para ser considerado válido. [Range(minimumValue, maximumValue)] public int Property { get; set; }

Además, acepta una propiedad opcional ErrorMessage que se puede usar para configurar el mensaje recibido por el usuario cuando se ingresan datos no válidos: [Range(minimumValue, maximumValue, ErrorMessage = "{your-error-message}")] public int Property { get; set; }

Ejemplo [Range(1,100, ErrorMessage = "Ranking must be between 1 and 100.")] public int Ranking { get; set; }

Atributo de expresión regular El atributo [RegularExpression] puede decorar cualquier propiedad o campo público y especifica una expresión regular que debe coincidir para que la propiedad se considere válida.

https://riptutorial.com/es/home

18

[RegularExpression(validationExpression)] public string Property { get; set; }

Además, acepta una propiedad opcional ErrorMessage que se puede usar para configurar el mensaje recibido por el usuario cuando se ingresan datos no válidos: [RegularExpression(validationExpression, ErrorMessage = "{your-error-message}")] public string Property { get; set; }

Ejemplo (s) [RegularExpression(@"^[a-z]{8,16}?$", ErrorMessage = "A User Name must consist of 8-16 lowercase letters")] public string UserName{ get; set; } [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Please enter a valid ZIP Code (e.g. 12345, 12345-1234)")] public string ZipCode { get; set; }

Comparar atributo El atributo de Compare compara dos propiedades de un modelo. El mensaje de error se puede especificar usando la propiedad ErrorMessage o usando archivos de recursos. Para usar el atributo Compare incluya using para el siguiente espacio de nombres: using System.ComponentModel.DataAnnotations;

Luego puedes usar el atributo en tu modelo: public class RegisterModel { public string Email { get; set; } [Compare("Email", ErrorMessage = "The Email and Confirm Email fields do not match.")] public string ConfirmEmail { get; set; } }

Cuando se valida este modelo, si Email y ConfirmEmail tienen valores diferentes, la validación fallará. Mensajes de error localizados Al igual que con todos los atributos de validación, es posible usar mensajes de error de archivos de recursos. En este ejemplo, el mensaje de error se cargará desde los recursos del archivo de Resources , el nombre del recurso es CompareValidationMessage : public class RegisterModel { public string Email { get; set; }

https://riptutorial.com/es/home

19

["Email", ErrorMessageResourceType = typeof(Resources), "CompareValidationMessage")] public string ConfirmEmail { get; set; } }

ErrorMessageResourceName =

Evitar cadenas en nombres de propiedades Para evitar utilizar la cadena para el valor de la propiedad, en C # 6+ puede usar la palabra clave nameof : public class RegisterModel { public string Email { get; set; } [Compare(nameof(Email), ErrorMessage = "The Email and Confirm Email fields do not match.")] public string ConfirmEmail { get; set; } }

Marcadores de posición en mensajes de error Puede utilizar marcadores de posición en sus mensajes de error. El marcador de posición {0} se reemplaza con el nombre de visualización de la propiedad actual y {1} se reemplaza con el nombre de visualización de la propiedad relacionada: public class RegisterModel { [Display(Name = "Email")] public string Email { get; set; } [Display(Name = "Confirm Email")] [Compare("Email", ErrorMessage = "The '{1}' and '{0}' fields do not match.")] public string ConfirmEmail { get; set; } }

Si la validación del modelo falla, el mensaje de error será Los campos 'Correo electrónico' y 'Confirmar correo electrónico' no coinciden.

Atributo de validación personalizado Cuando se trata de validar algunas reglas que no son validación de datos genéricos, por ejemplo, asegurarse de que se requiere un campo o algún rango de valores, pero que son específicos para su lógica de negocios, puede crear su propio Validador personalizado . Para crear un atributo de validación personalizado, solo necesita inherit clase ValidationAttribute y override su método IsValid . El método IsValid toma dos parámetros, el primero es un object denominado como value y el segundo es un ValidationContext object llamado validationContext . Value refiere al valor real del campo que va a validar su validador personalizado. Supongamos que desea validar el Email través de un Custom

https://riptutorial.com/es/home

Validator

20

public class MyCustomValidator : ValidationAttribute { private static string myEmail= "[email protected]"; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string Email = value.ToString(); if(myEmail.Equals(Email)) return new ValidationResult("Email Already Exist"); return ValidationResult.Success; } } public class SampleViewModel { [MyCustomValidator] [Required] public string Email { get; set; } public string Name { get; set; } }

Aquí está su DotNetFiddle Demo

Modelo EDMx - Anotación de datos Edmx modelo internel public partial class ItemRequest { public int RequestId { get; set; } //... }

Agregando anotación de datos a esto: si modificamos este modelo directamente, cuando se realiza una actualización del modelo, los cambios se pierden. asi que Para agregar un atributo en este caso 'Requerido' Crear una nueva clase - cualquier nombre Entonces using System.ComponentModel; using System.ComponentModel.DataAnnotations; //make sure the namespace is equal to the other partial class ItemRequest namespace MvcApplication1.Models { [MetadataType(typeof(ItemRequestMetaData))] public partial class ItemRequest { } public class ItemRequestMetaData { [Required]

https://riptutorial.com/es/home

21

public int RequestId {get;set;} //... } }

o using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace YourApplication.Models { public interface IEntityMetadata { [Required] Int32 Id { get; set; } } [MetadataType(typeof(IEntityMetadata))] public partial class Entity : IEntityMetadata { /* Id property has already existed in the mapped class */ } }

Anotaciones de datos para la primera implementación de la base de datos (código de modelo generado automáticamente) [MetadataType(typeof(RoleMetaData))] public partial class ROLE { } public class RoleMetaData { [Display(Name = "Role")] public string ROLE_DESCRIPTION { get; set; } [Display(Name = "Username")] public string ROLE_USERNAME { get; set; } }

Si utilizó la base de datos primero y su código de modelo se generó automáticamente, este mensaje aparecerá sobre su código de modelo: Este código fue generado a partir de una plantilla. Los cambios manuales en este archivo pueden causar un comportamiento inesperado en su aplicación. Los cambios manuales en este archivo se sobrescribirán si el código se regenera Si desea usar anotaciones de datos y no desea que se sobrescriban si actualiza el edmx, simplemente agregue otra clase parcial a su carpeta modelo que se parece al ejemplo anterior. Lea Anotaciones de datos en línea: https://riptutorial.com/es/asp-net-mvc/topic/1961/anotaciones-

https://riptutorial.com/es/home

22

de-datos

https://riptutorial.com/es/home

23

Capítulo 6: Áreas Introducción ¿Qué es el área? Un área es una unidad más pequeña en la aplicación MVC que se utiliza como una forma de separar una gran cantidad de módulos de aplicaciones en grupos funcionales. Una aplicación puede contener múltiples áreas que se almacenan en la carpeta Áreas. Cada área puede contener diferentes modelos, controladores y vistas según los requisitos. Para usar un área, es necesario registrar el nombre del área en RouteConfig y definir el prefijo de la ruta.

Observaciones Si quieres ir a esta área a través de tu controlador predeterminado return RedirectToAction("Index","Home",new{area="areaname"});

Examples Crear una nueva área Haga clic derecho en la carpeta / nombre de su proyecto y cree un área nueva y asígnele un nombre. En la aplicación mvc internet / empty / basic se creará una carpeta con el nombre del área, que contendrá tres carpetas diferentes llamadas controlador, modelo y vistas y un archivo de clase llamado " areaname AreaRegistration.cs"

Configurar RouteConfig.cs En su carpeta App_start abra routeconfig.cs y haga esto routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces:new []{"nameofyourproject.Controllers"}// add this line ; );

Cree un nuevo controlador y configure areanameAreaRegistration.cs

https://riptutorial.com/es/home

24

maproute Crear un nuevo controlador foreg ControllerName: "Home", ActionresultName: "Index" abra AreaRegistraion.cs y agregue el nombre del controlador y el nombre de la acción que se redireccionará a context.MapRoute( "nameofarea_default", "nameofarea/{controller}/{action}/{id}", // url shown will be like this in browser new {controller="Home", action = "Index", id = UrlParameter.Optional } );

Lea Áreas en línea: https://riptutorial.com/es/asp-net-mvc/topic/6310/areas

https://riptutorial.com/es/home

25

Capítulo 7: Asp.net mvc enviar correo Examples Formulario de contacto en Asp MVC 1. Modelo: public class ContactModel { [Required, Display(Name="Sender Name")] public string SenderName { get; set; } [Required, Display(Name = "Sender Email"), EmailAddress] public string SenderEmail { get; set; } [Required] public string Message { get; set; } }

2. Controlador: public class HomeController { [HttpPost] [ValidateAntiForgeryToken] public async Task Contact(ContectModel model) { if (ModelState.IsValid) { var mail = new MailMessage(); mail.To.Add(new MailAddress(model.SenderEmail)); mail.Subject = "Your Email Subject"; mail.Body = string.Format("

Email From: {0} ({1})

Message:

{2}

", model.SenderName, mail.SenderEmail, model.Message); mail.IsBodyHtml = true; using (var smtp = new SmtpClient()) { await smtp.SendMailAsync(mail); return RedirectToAction("SuccessMessage"); } } return View(model); } public ActionResult SuccessMessage() { return View(); } }

3. Web.Config:

https://riptutorial.com/es/home

26





4. Ver: Contact.cshtml @model ContectModel @using (Html.BeginForm()) { @Html.AntiForgeryToken() Send your comments.

@Html.LabelFor(m => m.SenderName, new { @class = "col-md-2 control-label" })

@Html.TextBoxFor(m => m.SenderName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.SenderName)

@Html.LabelFor(m => m.SenderEmail, new { @class = "col-md-2 control-label" })

@Html.TextBoxFor(m => m.SenderEmail, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.SenderEmail)

@Html.LabelFor(m => m.Message, new { @class = "col-md-2 control-label" })

@Html.TextAreaFor(m => m.Message, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Message)





}

SuccessMessage.cshtml Your message has been sent

Enviando correo electrónico desde la clase De esta manera, puede ser muy útil, pero algunas personas (como yo) tienen un código de repetición, y como usted nos muestra, significa que necesito crear un controlador de contacto con

https://riptutorial.com/es/home

27

el mismo código en cada proyecto que tenemos, por lo que , Creo que esto puede ser útil también Esta es mi clase, que puede estar en una DLL o lo que sea public class Emails { public static void SendHtmlEmail(string receiverEmail, string subject, string body, bool Ssl = false) { //Those are read it from webconfig or appconfig var client = new SmtpClient(ConfigurationManager.AppSettings["MailServer"], Convert.ToInt16 (ConfigurationManager.AppSettings["MailPort"])) { Credentials = new NetworkCredential(ConfigurationManager.AppSettings["MailSender"], ConfigurationManager.AppSettings["MailSenderPassword"]), EnableSsl = Ssl }; MailMessage message = new MailMessage(); message.From = new MailAddress(ConfigurationManager.AppSettings["MailSender"]); message.To.Add(receiverEmail); // message.To.Add("[email protected]"); message.Subject = subject; message.IsBodyHtml = true; message.Body = body; client.Send(message); } }

Como se ve, se leerá desde el webconfig, así que necesitamos configurarlo, esta configuración es para Gmail, pero cada host tiene su propia configuración.







Lea Asp.net mvc enviar correo en línea: https://riptutorial.com/es/asp-net-mvc/topic/9736/asp-netmvc-enviar-correo

https://riptutorial.com/es/home

28

Capítulo 8: Ayudantes html Introducción Los ayudantes de HTML son métodos utilizados para representar elementos HTML en una vista. Son parte del espacio de nombres System.Web.Mvc.HtmlHelper . Hay diferentes tipos de ayudantes de HTML: Ayudantes HTML estándar : se utilizan para representar elementos HTML normales, por ejemplo, Html.TextBox() . Ayudantes HTML fuertemente tipados : estos ayudantes representan elementos HTML basados en las propiedades del modelo, por ejemplo, Html.TextBoxFor() . Ayudantes HTML personalizados : el usuario puede crear un método auxiliar personalizado que devuelve MvcHtmlString .

Examples Ayudante HTML personalizado - Nombre para mostrar /// /// Gets displayName from DataAnnotations attribute /// /// /// /// /// /// public static MvcHtmlString GetDisplayName(this HtmlHelper htmlHelper, Expression expression) { var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var value = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression)); return MvcHtmlString.Create(value); }

Ayudante personalizado - botón Enviar de envío /// /// Creates simple button /// /// /// /// public static MvcHtmlString SubmitButton(this HtmlHelper poHelper, string psValue) { return new MvcHtmlString(string.Format("", psValue));

https://riptutorial.com/es/home

29

}

Lista exhaustiva de ejemplos de HtmlHelper que incluye salida HTML HtmlHelper.Action()



@Html.Action(actionName: "Index")

salida: el HTML representado por un método de acción denominado Index() •

@Html.Action(actionName: "Index", routeValues: new {id = 1})

salida: el HTML representado por un método de acción llamado Index(int •

@(Html.Action("Index", routeValues: new RouteValueDictionary(new Dictionary{ {"id", 1} })))

salida: el HTML representado por un método de acción llamado Index(int •

id)

id)

@Html.Action(actionName: "Index", controllerName: "Home")

salida: el código HTML representado por un método de acción denominado Index() en el HomeController •

@Html.Action(actionName: "Index", controllerName: "Home", routeValues: new {id = 1})

salida: el HTML representado por un método de acción denominado Index(int

id)

en el

id)

en el

HomeController



@Html.Action(actionName: "Index", controllerName: "Home", routeValues: new RouteValueDictionary(new Dictionary{ {"id", 1} }))

salida: el HTML representado por un método de acción denominado Index(int HomeController HtmlHelper.ActionLink()



@Html.ActionLink(linkText: "Click me", actionName: "Index")

salida: Click me

@Html.ActionLink()

salida:

@HtmlHelper.BeginForm()



@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new {id="form1",@class = "form-horizontal"}))

salida:

Ayudantes HTML estándar con sus salidas HTML Html.TextBox ()

https://riptutorial.com/es/home

30



@Html.TextBox("Name", null, new { @class = "form-control" })

salida: @Html.TextBox("Name", "Stack Overflow", new { @class = "form-control" })

salida:

Html.TextArea () •

@Html.TextArea("Notes", null, new { @class = "form-control" })

salida: @Html.TextArea("Notes", "Please enter Notes", new { @class = "form-control" })

salida: Please

enter Notes

Html.Label () •

@Html.Label("Name","FirstName")

output: FirstName @Html.Label("Name", "FirstName", new { @class = "NameClass" })

output: FirstName

Html.Hidden () •

@Html.Hidden("Name", "Value")

salida:

Html.CheckBox () •

@Html.CheckBox("isStudent", true)

salida:

Html.Password () •

@Html.Password("StudentPassword")

salida:

Ayudante personalizado - Botón de radio renderizado con etiqueta public static MvcHtmlString RadioButtonLabelFor(this HtmlHelper self, Expression expression, bool value, string labelText) { // Retrieve the qualified model identifier string name = ExpressionHelper.GetExpressionText(expression); string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); // Generate the base ID TagBuilder tagBuilder = new TagBuilder("input"); tagBuilder.GenerateId(fullName); string idAttr = tagBuilder.Attributes["id"]; // Create an ID specific to the boolean direction idAttr = string.Format("{0}_{1}", idAttr, value); // Create the individual HTML elements, using the generated ID

https://riptutorial.com/es/home

31

MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr }); MvcHtmlString label = self.Label(idAttr, labelText); return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString()); }

Ejemplo: @Html.RadioButtonLabelFor(m

=> m.IsActive, true, "Yes")

Ayudante personalizado - Selector de fecha y hora public static MvcHtmlString DatePickerFor(this HtmlHelper htmlHelper, Expression expression, object htmlAttributes) { var sb = new StringBuilder(); var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var dtpId = "dtp" + metaData.PropertyName; var dtp = htmlHelper.TextBoxFor(expression, htmlAttributes).ToHtmlString(); sb.AppendFormat(" {1} ", dtpId, dtp); return MvcHtmlString.Create(sb.ToString()); }

Ejemplo: @Html.DatePickerFor(model => model.PublishedDate,

new { @class = "form-control" })

Si usa Bootstrap.v3.Datetimepicker, su JavaScript es como el siguiente: $('#dtpPublishedDate').datetimepicker({ format: 'MMM DD, YYYY' });

Lea Ayudantes html en línea: https://riptutorial.com/es/asp-net-mvc/topic/2290/ayudantes-html

https://riptutorial.com/es/home

32

Capítulo 9: Dockerización de la aplicación ASP.NET Examples Dockerfile y Nuget La aplicación Dockerization de ASP.NET requiere un Dockerfile para su configuración y su ejecución como contenedor de ventana acoplable. FROM microsoft/dotnet:latest RUN apt-get update && apt-get install sqlite3 libsqlite3-dev COPY . /app WORKDIR /app RUN ["dotnet", "restore"] RUN ["dotnet", "build"] RUN npm install && npm run postscript RUN bower install RUN ["dotnet", "ef", "database", "update"] EXPOSE 5000/tcp ENTRYPOINT ["dotnet", "run", "--server.urls", "http://0.0.0.0:5000"]

Un archivo de configuración de alimentación de nuget ayuda a recuperar de la fuente correcta. El uso de este archivo depende de la configuración actual del proyecto y puede cambiar a los requisitos del proyecto de la suite.



Soporte POSTGRESQL. https://riptutorial.com/es/home

33

"Data": { "DefaultConnection": { "ConnectionString": "Host=localhost;Username=postgres;Password=******;Database=postgres;Port=5432;Pooling=true;" } },

Dockerización Es necesario tener .NET o un paquete mono-aspnet. Es importante entender la importancia de la dockerización. Instale dotnet en ubuntu o en el sistema operativo en el que está trabajando. Instalando DOTNET $ sudo trusty $ sudo $ sudo

sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ main" > /etc/apt/sources.list.d/dotnetdev.list' apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893 apt-get update

Ubuntu 16.04

$ sudo xenial $ sudo $ sudo

sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ main" > /etc/apt/sources.list.d/dotnetdev.list' apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893 apt-get update

Instalar .NET Core SDK $ sudo apt-get install dotnet-dev-1.0.0-preview2-003121

CORTESÍA: https://www.microsoft.com/net/core#ubuntu Para la instalación de Docker, siga https://docs.docker.com/engine/installation/linux/ubuntulinux/ POR PUERTO: Kestrel server port : 5000 Docker Deamon will listen to port : EXPOSE 5000/tcp

Para la construcción de docker: $ sudo docker build -t myapp .

Para ejecutar el contenedor docker: $ sudo docker run -t -d -p 8195:5000 myapp

https://riptutorial.com/es/home

34

Para visitar el sitio: $ ifconfig eth0 : ***.***.** server-ip-address

El sitio estará disponible en (dada esta configuración): http://server-ip-address:8195

Procesos Docker. Se listarán los procesos en ejecución. $ sudo docker ps

Para eliminar el proceso o el contenedor. $ sudo docker rm -rf

Lea Dockerización de la aplicación ASP.NET en línea: https://riptutorial.com/es/asp-netmvc/topic/6740/dockerizacion-de-la-aplicacion-asp-net

https://riptutorial.com/es/home

35

Capítulo 10: Empaquetado y Minificación Examples Minificación La minificación se utiliza para reducir el tamaño de los archivos CSS y Javascript para acelerar los tiempos de descarga. Este proceso se realiza mediante la eliminación de todos los espacios en blanco, comentarios y cualquier otro contenido no esencial de los archivos. Este proceso se realiza automáticamente cuando se utiliza un objeto ScriptBundle o StyleBundle . Si necesita deshabilitarlo, debe usar un objeto Bundle básico.

Ejemplo usando minificación El siguiente código usa directivas de preprocesador para aplicar el agrupamiento solo durante las versiones a fin de permitir una depuración más fácil durante las versiones no liberadas (ya que los archivos no empaquetados suelen ser más fáciles de navegar): public static void RegisterBundles(BundleCollection bundles) { #if DEBUG bundles.Add(new Bundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js")); bundles.Add(new Bundle("~/Content/css").Include("~/Content/site.css")); #else bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery{version}.js")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); #endif }

Guiones y paquetes de estilo El siguiente es el fragmento de código predeterminado para el archivo BundleConfig.cs. using System.Web.Optimization; public class BundleConfig { // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725 public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); // Use the development version of Modernizr to develop with and learn from. Then, when you're // ready for production, use the build tool at http://modernizr.com to pick only the tests you need. bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(

https://riptutorial.com/es/home

36

"~/Scripts/modernizr-*")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( "~/Content/themes/base/jquery.ui.core.css", "~/Content/themes/base/jquery.ui.resizable.css", } }

Los paquetes se registran en el archivo Global.asax dentro del método Application_Start (): using System.Web.Optimization; protected void Application_Start() { BundleConfig.RegisterBundles(BundleTable.Bundles); }

Los paquetes deben ser representados en tus Vistas como tal: @using System.Web.Optimization @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/modernizr") @Styles.Render("~/Content/css") @Styles.Render("~/Content/themes/base/css")

Tenga en cuenta que la agrupación no se produce cuando está en modo de desarrollo (donde el elemento de compilación en el archivo Web.config se establece en debug = "true"). En su lugar, las declaraciones de Render en sus Vistas incluirán cada archivo individual en un formato no agrupado, no minificado, para facilitar la depuración. Una vez que la aplicación está en modo de producción (donde el elemento de compilación en el archivo Web.config se establece en debug = "false"), se realizará la agrupación. Esto puede llevar a complicaciones para los scripts que hacen referencia a rutas relativas de otros archivos, como las referencias a los archivos de iconos de Twitter Bootstrap. Esto se puede abordar utilizando la clase CssRewriteUrlTransform de System.Web.Optimization: bundles.Add(new StyleBundle("~/bundles/css").Include( "~/Content/css/*.css", new CssRewriteUrlTransform()));

La clase CssRewriteUrlTransform reescribirá las URL relativas dentro de los archivos agrupados en rutas absolutas, de modo que las referencias permanecerán intactas después de que la referencia de llamada se mueva a la ubicación del paquete (p. Ej., Utilizando el código anterior, pasando de "~ / Content / css / bootstrap.css "a" ~ / bundles / css / bootstrap.css "). Lea Empaquetado y Minificación en línea: https://riptutorial.com/es/asp-netmvc/topic/1959/empaquetado-y-minificacion

https://riptutorial.com/es/home

37

Capítulo 11: Enrutamiento Introducción El enrutamiento es cómo ASP.NET MVC hace coincidir un URI con una acción. El módulo de enrutamiento es responsable de asignar las solicitudes entrantes del navegador a las acciones particulares del controlador MVC. MVC 5 admite un nuevo tipo de enrutamiento, llamado enrutamiento de atributos. Como su nombre lo indica, el enrutamiento de atributos utiliza atributos para definir rutas. El enrutamiento de atributos le brinda más control sobre los URI en su aplicación web.

Examples Enrutamiento personalizado El enrutamiento personalizado proporciona una necesidad especializada de enrutamiento para manejar solicitudes entrantes específicas. Para definir rutas personalizadas, tenga en cuenta que el orden de las rutas que agrega a la tabla de rutas es importante. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // this is an advanced custom route // you can define custom URL with custom parameter(s) point to certain action method routes.MapRoute( "CustomEntry", // Route name "Custom/{entryId}", // Route pattern new { controller = "Custom", action = "Entry" } // Default values for defined parameters above ); // this is a basic custom route // any custom routes take place on top before default route routes.MapRoute( "CustomRoute", // Route name "Custom/{controller}/{action}/{id}", // Route pattern new { controller = "Custom", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // Route pattern new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above ); }

https://riptutorial.com/es/home

38

y action nombres de action están reservados. Por defecto, MVC asigna {controller} parte de la URL a la Controller y luego busca un método con el nombre sin agregar ningún sufijo. controller

Aunque puede ser tentador crear una familia de rutas utilizando la plantilla {controller}/{action}/{parameter} al hacer esto usted revela la estructura de su aplicación y hace que las URL sean algo frágiles porque cambiar el nombre del controlador cambia la configuración. Ruta y rompe los enlaces guardados por el usuario. Prefiere configuración de ruta explícita: routes.MapRoute( "CustomRoute", // Route name "Custom/Index/{id}", // Route pattern new { controller = "Custom", action = nameof(CustomController.Index), id = UrlParameter.Optional } );

(no puede usar el nameof operador para el nombre del controlador, ya que tendrá un sufijo adicional Controller ) que se debe omitir al configurar el nombre del controlador en la ruta.

Añadiendo ruta personalizada en mvc El usuario puede agregar una ruta personalizada, asignando una URL a una acción específica en un controlador. Esto se utiliza para propósitos de optimización de motores de búsqueda y hace que las URL sean legibles. routes.MapRoute( name: "AboutUsAspx", // Route name url: "AboutUs.aspx", // URL with parameters defaults: new { controller = "Home", action = "AboutUs", id = UrlParameter.Optional } Parameter defaults );

//

Atributo de enrutamiento en MVC Junto con la forma clásica de definición de ruta, MVC WEB API 2 y luego MVC 5 introdujeron el Attribute routing : public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // This enables attribute routing and must go before other routes are added to the routing table. // This makes attribute routes have higher priority routes.MapMvcAttributeRoutes(); } }

https://riptutorial.com/es/home

39

Para rutas con el mismo prefijo dentro de un controlador, puede establecer un prefijo común para todos los métodos de acción dentro del controlador utilizando el atributo RoutePrefix . [RoutePrefix("Custom")] public class CustomController : Controller { [Route("Index")] public ActionResult Index() { ... } }

es opcional y define la parte de la URL que tiene el prefijo de todas las acciones del controlador. RoutePrefix

Si tiene varias rutas, puede establecer una ruta predeterminada al capturar la acción como parámetro y luego aplicarla a todo el controlador, a menos que se defina el atributo de Route específico en ciertos métodos de acción que anulan la ruta predeterminada. [RoutePrefix("Custom")] [Route("{action=index}")] public class CustomController : Controller { public ActionResult Index() { ... } public ActionResult Detail() { ... } }

Conceptos básicos de enrutamiento Cuando solicite la url yourSite/Home/Index través de un navegador, el módulo de enrutamiento dirigirá la solicitud al método de acción Index de la clase HomeController . ¿Cómo sabe enviar la solicitud al método específico de esta clase específica? Ahí viene la RouteTable. Cada aplicación tiene una tabla de ruta donde almacena el patrón de ruta e información sobre dónde dirigir la solicitud. Así que cuando creas tu aplicación mvc, hay una ruta predeterminada ya registrada en la tabla de enrutamiento. Puedes ver eso en la clase RouteConfig.cs . public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); }

Puedes ver que la entrada tiene un nombre y una plantilla. La plantilla es el patrón de ruta que

https://riptutorial.com/es/home

40

debe verificarse cuando llega una solicitud. La plantilla predeterminada tiene Home como el valor del segmento url del controlador y el Index como el valor del segmento de acción. Eso significa que, si no pasa explícitamente un nombre y una acción del controlador en su solicitud, utilizará estos valores predeterminados. Esta es la razón por la que obtiene el mismo resultado cuando accede a su yourSite/Home/Index y su yourSite Es posible que haya notado que tenemos un parámetro llamado id como el último segmento de nuestro patrón de ruta. Pero en los valores por defecto, especificamos que es opcional. Esa es la razón por la que no tuvimos que especificar el valor de id int url que intentamos. Ahora, vuelva al método de acción de índice en HomeController y agregue un parámetro a ese public ActionResult Index(int id) { return View(); }

Ahora pon un punto de vista visual de estudio en este método. Ejecute su proyecto y acceda a su yourSite/Home/Index/999 en su navegador. Se alcanzará el punto de interrupción y debería poder ver que el valor 999 ahora está disponible en el parámetro id . Creando un segundo patrón de ruta Digamos que nos gustaría configurarlo para que se llame al mismo método de acción para un patrón de ruta diferente. Podemos hacerlo agregando una nueva definición de ruta a la tabla de rutas. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // New custom route definition added routes.MapRoute("MySpecificRoute", "Important/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); //Default catch all normal route definition routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); }

La nueva definición que agregué tiene un patrón Important/{id} donde id es nuevamente opcional. Eso significa que cuando solicite su yourSiteName\Important o su yourSiteName\Important\888 , se enviará a la acción del Índice de HomeController. Orden de registro de definición de ruta El orden de registro de ruta es importante. Siempre debe registrar los patrones de ruta específicos antes de la ruta genérica predeterminada.

Ruta de todo

https://riptutorial.com/es/home

41

Supongamos que queremos tener una ruta que permita un número ilimitado de segmentos así: • • • • • •

http://example.com/Products/ (ver todos los productos) http://example.com/Products/IT http://example.com/Products/IT/Laptops http://example.com/Products/IT/Laptops/Ultrabook http://example.com/Products/IT/Laptops/Ultrabook/Asus etc.

Tendríamos que agregar una ruta, normalmente al final de la tabla de rutas, ya que esto probablemente detectaría todas las solicitudes, de este modo: routes.MapRoute("Final", "Route/{*segments}", new { controller = "Product", action = "View" });

En el controlador, una acción que podría manejar esto, podría ser: public void ActionResult View(string[] segments /*