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 re remota ut utilizada pa para ve verificar si si e ell c co ontenido qu que se ingresa en en el el c co ontrol d de e
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 Lista exhaustiva de ejemplos de HtmlHelper que incluye salida HTML
29 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 ación de campos de fecha manu anualmente con formato atos dinámicos utilizando el cuader derno 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, 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 patrón de marco formularios web de ASP.NET crear aplicaciones web. El marco dealternativa ASP.NET al MVC es un de presentación ligero ypara 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 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 • Vistas 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 Controladores Los 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
MVC 2.0
.NET 3.5 / 4.0 2010-03-10
MVC 3.0
.NET 4.0
MVC 4.0
.NET 4.0 / 4.5 2012-08-15
https://riptutorial.com/es/home
2009-03-13
2011-01-13
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 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 Modelo : controladores y vistas. Vista : las vistas son las páginas que representan y muestran los datos del modelo al usuario. Las Vista : 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 Controlador : 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. ProporcionaPor un ejemplo, marco extensible y conectable que sedepuede reemplazar y personalizar 2. fácilmente. si no desea utilizar el motor 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 l a 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 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 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
plano".
, o se puede definir manualmente en el formato adecuado, por ejemplo, "texto /
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 l a 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 l a 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 l a 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 l a 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 : : 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 l a 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 l a 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 una instancia que deriva de ActionResult. 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 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 que se utiliza si el método de acción de debe be 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 website.com/Example/HelloWorld 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
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
12
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 apliqueny amostrar las propiedades de nuestro modelo, ASP.NET MVC se encargará de hacerlas cumplir los mensajes apropiados a losy 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 l ógica del controlador pueda ignorar los valores del registro existente. Modelo public int? ID { g get; et; 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 opcionalseErrorMessage que se mensaje recibido por propiedad el usuario cuando ingresan datos no puede válidos:usar para configurar el [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),
ErrorMessageResourceName =
"CompareValidationMessage")] public string ConfirmEmail { get; set; } }
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 toma dos parámetros, el primero es un object denominado como value y el segundo es un ValidationContext object llamado validationContext . Value 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
Validator
https://riptutorial.com/es/home
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]
20
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
de-datos
22
https://riptutorial.com/es/home
23
Capítulo 6: Áreas Introducción ¿Qué es el área? Un área una es una másdepequeña aplicación MVC que sefuncionales. utiliza comoUna una aplicación forma de separar granunidad cantidad módulosendelaaplicaciones en grupos 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 tr avé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" 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 r epresentar 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 : estándar : se utilizan para representar elementos HTML normales, por ejemplo, Html.TextBox() . Ayudantes HTML fuertemente tipados : tipados : estos ayudantes representan elementos HTML basados en las propiedades del modelo, por ejemplo, Html.TextBoxFor() . Ayudantes HTML personalizados : 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
@(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)
Index(int 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
en el
id)
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
en el
id)
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 Ejemplo:
=> 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, Bootstrap.v3.Datetimepicker, su 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 depende de la configuración actual del proyecto y puede cambiar a los requisitos delarchivo proyecto de la suite.
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 sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list' $ sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893 $ sudo apt-get update Ubuntu 16.04
$ sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list' $ sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893 $ sudo 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
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
34
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 ttodos odos 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 i ncluirá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 = "Hom "Home", e", 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 de vista 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 (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 /*