Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Crear en Visual Studio Una Aplicación Web en MVC
Crear en Visual Studio Una Aplicación Web en MVC
- Modelo: Representa al objeto que tiene todos los datos con los
cuales se va a trabajar, este objeto sera utilizado por la vista y
controlador.
3.- Una vez guardado el proyecto, te mostrara una pantalla con las
plantillas de proyectos web ASP.Net disponibles, de esta pantalla
seleccionaremos la plantilla de "MVC" y daremos click a aceptar
4.- A continuación veras que Visual Studio empezara a generar todos
los archivos necesarios para la creación de nuestro proyecto, entre
estos se generan y guardan todas las librerías que vamos a utilizar,
así como la estructura archivos propios de un proyecto de ASP MVC,
al finalizar te deberá mostrar una pantalla como la siguiente:
5.- Hablemos un poco de la estructura de archivos de un proyecto de
ASP MVC, como era de suponerse, se crearon las carpetas de los
controladores, modelos y vistas (Controllers, Models y Views), aparte
estas 3 tenemos varias que ha generado el Visual Studio para tener
todo organizado, por ejemplo tenemos la carpeta de Content, que es
donde meteremos todos aquellos recursos como imágenes, estilos
(css), tambien tenemos una carpeta exclusiva para meter todos
aquellos scripts necesarios (js), de la misma manera tenemos una
llamada Fonts que almacenara todas los archivos de fuentes que
necesitemos, si nos llegaran a faltar carpetas, podemos agregarlas
dando click secundario sobre el proyecto y luego "Agregar" - "Nueva
Carpeta", como por ejemplo nos falta una carpeta en la cual meter
todos los archivos de recursos (como ya sabemos los archivos de
recursos (.resx) son aquellos que nos sirven para meter los textos
mostrados en la aplicación y que nos ayudan mucho cuando
necesitamos un sitio multi idioma)
Una vez entendido lo anterior, tenemos una idea mas clara de como
esta distribuido un proyecto en ASP MVC, ahora lo que falta es verlo
en funcionamiento, para esto solo tenemos que dar click en el botón
de play para que se ejecute en el navegar de nuestra preferencia, te
debería de aparecer algo similar a la siguiente pantalla, si tuvieras
dudas en algunos de los pasos por favor hazlo notar en los
comentarios en la parte de abajo, los cuales revisamos tan pronto
como podemos
Explicación de las rutas generadas en MVC (Routing)
MiPrimeraAplicacionMVC/mostrarelemento.aspx?id=U1
MiPrimeraAplicacionMVC/elemento/mostrar/U1
Default: definimos el objeto que tomara los valores por defecto del
formato de la ruta, por ejemplo en la definición de la captura, de dice
que por default, se va entrar al controlador "Home" y ejecutar la
función "Index", y se le indica que el parámetro ID es opcional, por lo
tanto no hace falta definirlo
routes.MapRoute(
name: "Nueva",
url: "Mostrar/{id}",
defaults: new { controller = "Home", action = "MostrarElemento"}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id =
UrlParameter.Optional }
);
}
}
Ahora que hemos entendido como funcionan los formatos de las rutas
y la manera de agregar otros, podemos pasar al siguiente punto, para
conocer cual es el orden de ejecución de un proyecto en ASP MVC
En esta parte del tutorial veremos cual es el flujo del programa, cuales
son los puntos por donde pasa la ejecución de nuestro código, esto
para entender un poco mas a profundidad como es que una aplicación
en MVC trabaja, te recomiendo visitar el primer post de este
tutorial para tener mas info del modelo MVC
Los pasos por los que pasa la ejecución de nuestra aplicación en MVC
es el siguiente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MiPrimeraAplicacionMVC.Models
{
public class MiModelo
{
public string Nombre;
public string Apellidos;
public int Edad;
}
}
El modelo anterior lo utilizaremos para mandarle datos de nuestro
controlador a nuestra vista, el método del controlador que ocuparemos
para nuestro ejemplo es el "Index", en el cual crearemos un objeto de
tipo "MiModelo", lo llenaremos y lo mandaremos a la vista para su
visualización, teniendo de esta manera nuestro controlador:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MiPrimeraAplicacionMVC.Models;
namespace MiPrimeraAplicacionMVC.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var m = new MiModelo();
m.Nombre = "Pancho";
m.Apellidos = "Perez";
m.Edad = 30;
return View(m);
}
return View();
}
}
}
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
<h1>Ejemplo de modelo</h1>
<p>@Html.LabelFor(m => m.Nombre) : @Model.Nombre </p>
<p>@Html.LabelFor(m => m.Apellidos) : @Model.Apellidos</p>
<p>@Html.LabelFor(m => m.Edad) : @Model.Edad</p>
</div>
En esta parte del tutorial trataremos las formas en las cuales puedes
pasar datos entre un request y otro, pasar datos del controlador a la
vista, etc, para esto podemos usar ViewData, ViewBag, TempData o
Session, ahora la cuestión es cuando y como usar cada uno de ellos,
a continuación lo explicamos
ViewData
El ViewData es utilizado para pasar datos del controller a la vista, ya
que su duración es solo durante el actual request, una vez que este
termina, este dato se abra borrado, de ahi que su uso es solo
temporal, comúnmente es usado para mandar mensajes de error a la
vista, otro dato importante en cuanto su uso, es que lo utilizar como si
fuera un arreglo, aquí un ejemplo
En el controller:
ViewData["nombre"] = "Pedro";
ViewData["apellido"] = "Pérez";
En la vista:
En la pagina:
ViewBag
En el controller:
ViewBag.nombreCompleto= “Pedro Pérez”
En la Vista:
Mi nombre es @ViewBag.nombreCompleto
En la pagina:
TempData
En el controller:
public ActionResult Index()
{
TempData[“nombreCompleto”] = "Pedro Pérez";
return RedirectToAction("MuestraNombre");
}
public ActionResult MuestraNombre()
{
string miNombre;
miNombre = TempData["nombreCompleto"].ToString();
return View(miNombre);
}
Session
En el controller:
public ActionResult Index()
{
System.Web.HttpContext.Current.Session["nombreCompleto "] = "Pedro
Pérez";
return RedirectToAction("MuestraNombre");
}
public ActionResult MuestraNombre()
{
string miNombre;
miNombre = System.Web.HttpContext.Current.Session["nombreCompleto
"].ToString();
return View(miNombre);
}
Ahora que ya entendemos para que sirven estos metodos para pasar
datos de forma temporal, podemos seguir con el siguiente punto, en el
cual veremos el manejo de los helpers en Asp.net MVC
Manejo de los Helpers en Asp.net MVC
En esta parte del tutorial veremos que son los helpers de html en
Asp.net MVC y como se usan, para definirlos de forma rápida y
sencilla son funciones las cuales nos regresan una cadena, es decir
un string con las cuales nos podemos ayudar para crear controles en
nuestra vista de forma sencilla, por ejemplo, hay helpers que nos
ayudan a crear los inputs, combos, radio botones, etc, a continuación
una lista con los helpers de html mas usados que ya vienen incluidos
con el framework:
Html.Beginform
Html.EndForm
Html.ActionLink
Html.Hidden
Html.Label
Html.Password
Html.CheckBox
Html.RadioButton
Html.ListBox
Html.DropDownLis
t Html.TextArea
Html.TextBox
@Html.Label("Nombre")
@Html.TextBox("txtNombre")
Se renderiza en el navegador:
y el código html:
<label for="Nombre">Nombre</label>
<input id="txtNombre" name="txtNombre" type="text" value="">
Html.HiddenFor
Html.LabelFor
Html.PasswordFor
Html.CheckBoxFor
Html.RadioButtonFor
Html.DropDownListFor
Html.ListBoxFor
Html.TextBoxFor
Html.TextAreaFor
@Html.LabelFor(m=>m.Nombre)
@Html.TextBoxFor(m => m.Nombre)
Se renderiza en el navegador:
y en el código html:
<label for="Nombre">Nombre</label>
<input id="Nombre" name="Nombre" type="text" value="">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HelpersMVC.Models
{
public class Persona
{
public string Nombre { get; set; }
public string Apellidos { get; set; }
public string Sexo { get; set; }
public string Edad { get; set; }
public bool Vive { get; set; }
}
}
using System.Web;
using System.Web.Mvc;
using HelpersMVC.Models;
namespace HelpersMVC.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Persona p)
{
return View(p);
}
}
}
@{
ViewBag.Title = "Home Page";
var lstValores = new List<SelectListItem>();
for (int i=0;i<100;i++)
{
lstValores.Add(new SelectListItem() { Value = i.ToString(), Text =
i.ToString() });
}
}
<div class="jumbotron">
<h1>Datos de ejemplo</h1>
<br />
<br />
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
@Html.LabelFor(m => m.Nombre)
@Html.TextBoxFor(m => m.Nombre)
<br />
@Html.LabelFor(m => m.Apellidos)
@Html.TextBoxFor(m => m.Apellidos)
<br />
@Html.Label("Hombre")
@Html.RadioButtonFor(m => m.Sexo, "Hombre", new { value = "Hombre" })
@Html.Label("Mujer")
@Html.RadioButtonFor(m => m.Sexo, "Mujer", new { value = "Mujer" })
<br />
@Html.LabelFor(m => m.Edad)
@Html.DropDownListFor(m => m.Edad, lstValores)
<br />
@Html.LabelFor(m => m.Vive)
@Html.CheckBoxFor(m => m.Vive)
<br />
<input type="submit" value="Submit" />
}
</div>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HelpersMVC.Models
{
public class Persona
{
public string Nombre { get; set; }
public string Apellidos { get; set; }
public string Sexo { get; set; }
public string Edad { get; set; }
public bool Vive { get; set; }
}
}
[Required]
public string Nombre { get; set; }
[Required]
public string Apellidos { get; set; }
@model HelpersMVC.Models.Persona
@{
ViewBag.Title = "Home Page";
var lstValores = new List<SelectListItem>();
for (int i=0;i<100;i++)
{
lstValores.Add(new SelectListItem() { Value = i.ToString(), Text =
i.ToString() });
}
}
<div class="jumbotron">
<h1>Datos de ejemplo</h1>
<br />
<br />
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
@Html.ValidationSummary("", new { @class = "text-danger" })
<br />
@Html.LabelFor(m => m.Nombre)
@Html.TextBoxFor(m => m.Nombre)
<br />
@Html.LabelFor(m => m.Apellidos)
@Html.TextBoxFor(m => m.Apellidos)
...
Existen varios data anotations, los cuales puedes utilizar para realizar
las validaciones, a continuación una lista con los mas comunes:
...
[Required]
[MinLength(length:1)]
[MaxLength(length:50)]
public string Nombre { get; set; }
[Required]
[MinLength(length: 1)]
[MaxLength(length: 50)]
public string Apellidos { get; set; }
...
...
[Required(ErrorMessage ="El campo Nombre no puede estar vacio")]
[MinLength(length:1)]
[MaxLength(length:50)]
public string Nombre { get; set; }
...
Como vemos los Data Annotations nos hacen la vida mas fácil al tratar
los temas de validación, a continuación te dejo los links con el ejemplo
funcionando para que lo puedas probar
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace VistasParciales.Models
{
public class Persona
{
public string imagen { get; set; }
public string nombre { get; set; }
public string apellido { get; set; }
public string direccion { get; set; }
public string contrasena { get; set; }
}
}
@model VistasParciales.Models.Persona
@{
ViewBag.Title = "Mi Página";
}
<div class="signup__overlay"></div>
</div>
@model VistasParciales.Models.Persona
@{
ViewBag.Title = "Mi Página";
}
@{
ViewBag.Title = "Mi Página";
}
<div class="signup__container">
@Html.Partial("Izquierda", Model)
@Html.Partial("Derecha", Model)
</div>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using VistasParciales.Models;
namespace VistasParciales.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
m.imagen = "~/Content/pic.jpg";
m.nombre = "Pedro";
m.apellido = "Perez";
m.direccion = "No conocida";
m.contrasena = "nolasabes";
return View(m);
}
}
}
Como pudiste ver, el uso de vistas parciales es relativamente fácil, la
organización es uno de sus usos, pero el mayor provecho se saca al
combinarlo con Ajax, para la recarga de partes de la pagina, lo cual
tocaremos en un punto mas adelante, ahora si, es tiempo de ver el
resultado final:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ContadorPalabras.Models
{
public class MiModelo
{
public string Texto { get; set; }
public int TotalPalabras { get; set; }
public List<Densidad> DensidadPalabras { get; set; }
}
Crear una lista de delimitadores, que serán los caracteres por los
cuales se van a identificar las palabras, por ejemplo, el espacio, la coma,
el salto de linea
Ya que tenemos las palabras en una lista, asignamos el total en la
propiedad total del modelo
Con la misma lista anterior, mediante linq, crearemos una query
donde agrupemos las palabras y saquemos la densidad de cada una para
ver la cantidad que se repite cada palabra, con esta info llenamos la lista
del modelo de densidad de palabras
Lo anterior quedaría de la siguiente manera:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ContadorPalabras.Models;
using System.Linq;
namespace ContadorPalabras.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var modelo = new MiModelo();
modelo.TotalPalabras = 0;
modelo.DensidadPalabras = new List<Densidad>();
return View(modelo);
}
[HttpPost]
public ActionResult Index(MiModelo modelo)
{
var palabras = new List<string>();
if (!string.IsNullOrEmpty(modelo.Texto))
{
var Delimitador= new List<char>();
Delimitador.Add(' ');
Delimitador.Add(',');
Delimitador.Add('\n');
palabras =
modelo.Texto.Split(Delimitador.ToArray()).ToList();
modelo.TotalPalabras = palabras.Count();
var query = palabras.GroupBy(c => c.ToString()).Select(grupo
=> new Densidad
{
Palabra = grupo.Key,
Cantidad = grupo.Count()
}).OrderByDescending(x => x.Cantidad);
modelo.DensidadPalabras = query.ToList();
}
return View(modelo);
}
}
}
@model ContadorPalabras.Models.MiModelo
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<div style="overflow:hidden">
<div style="width:600px; float:left">
<p class="lead">Ingresa un texto</p>
<p>@Html.TextAreaFor(m => m.Texto, new { style = "width: 400px !
important; height: 150px;" })</p>
<p><input type="submit" class="btn btn-primary btn-lg"
value="Contabilizar" /></p>
</div>
<div style="width:400px; float:right">
<p>Total de palabras = @Model.TotalPalabras </p>
<p>Densidad de palabras:</p>
@if (Model.DensidadPalabras !=null &&
Model.DensidadPalabras.Any()) {
foreach (var item in Model.DensidadPalabras)
{
<p style="text-indent: 3em">"@item.Palabra" -
@item.Cantidad repedita(s)</p>
}
}
</div>
</div>
}
</div>
A continuación te dejo los link tanto del proyecto como para que lo
pruebes directamente, ahora que tenemos un ejemplo funcional de una
aplicación en Asp.net MVC, podemos seguir con el siguiente punto
donde veremos como realizar una llamada asíncrona con Ajax
Hemos llegado al punto donde veremos algo que es muy usual en una
aplicación que se diga que tiene buena velocidad, y esto son las
llamadas asíncronas con Ajax, que como sabras, se utilizan para
refrescar la información de una cierta parte de la página, esto para no
tener que cargarla completamente y hacer así el proceso mas rápido y
óptimo
namespace ContadorPalabras
{
public class BundleConfig
{
// For more information on bundling, visit
https://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
bundles.Add(new ScriptBundle("~/bundles/ajax").Include(
"~/Scripts/jquery.unobtrusive-ajax.js"));
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js"));
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));
}
}
}
...
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/ajax")
@RenderSection("scripts", required: false)
</body>
</html>
Ahora ya tenemos todo listo para utilizarlo, entonces lo que
realizaremos, sera cambiar el Html.BeginForm por Ajax.BeginForm, al
utilizar esta función, debemos especificar mas parámetros, entre ellos,
el mas importante es definir el div a actualizar, ya que esta, es la única
parte de la página que se refrescara y así no cargara toda la página, en
nuestro caso, al div de la segunda columna, lo llamamos divResultado
Para que solo se cargue, esa unica parte, pasaremos esa parte de la
vista a una Partial View, que es una vista parcial, esto para que cuando
se renderise, solo se renderise esta parte, esto lo realizamos creando
una nueva vista en la misma carpeta donde esta el index, la cual
nombramos como "Resultado", esta nueva vista tendrá este contenido:
@model ContadorPalabras.Models.MiModelo
@model ContadorPalabras.Models.MiModelo
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
<div style="overflow:hidden">
@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { HttpMethod =
"POST", UpdateTargetId = "divResultado" }))
{
<div style="width:600px; float:left">
<p class="lead">Ingresa un texto</p>
<p>@Html.TextAreaFor(m => m.Texto, new { style = "width: 400px !
important; height: 150px;" })</p>
<p><input type="submit" class="btn btn-primary btn-lg"
value="Contabilizar" /></p>
</div>
}
<div id="divResultado" style="width:400px; float:right">
@Html.Partial("Resultado",Model)
</div>
</div>
</div>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ContadorPalabras.Models;
using System.Linq;
namespace ContadorPalabras.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var modelo = new MiModelo();
modelo.TotalPalabras = 0;
modelo.DensidadPalabras = new List<Densidad>();
return View(modelo);
}
[HttpPost]
public ActionResult Index(MiModelo modelo)
{
var palabras = new List<string>();
if (!string.IsNullOrEmpty(modelo.Texto))
{
var Delimitador= new List<char>();
Delimitador.Add(' ');
Delimitador.Add(',');
Delimitador.Add('\n');
palabras =
modelo.Texto.Split(Delimitador.ToArray()).ToList();
modelo.TotalPalabras = palabras.Count();
var query = palabras.GroupBy(c => c.ToString()).Select(grupo
=> new Densidad
{
Palabra = grupo.Key,
Cantidad = grupo.Count()
}).OrderByDescending(x => x.Cantidad);
modelo.DensidadPalabras = query.ToList();
}
return PartialView("Resultado",modelo);
}
}
}