Академический Документы
Профессиональный Документы
Культура Документы
ASP.NET MVC
1) New -> Project -> Aplicacin Web -> MVC -> Marcar opcin para agregar
Unit Test
2) Estructura de la solucin:
Properties
References
Archivo de configuracin:
CONTROLLER
Para agergar un nuevo controlador: clic derecho en carpeta Controller->New>Controller->Empty Controller
Nos crea una nueva clase y dentro de sta un nico mtodo Index que sera el
mtodo de acceso a nuestro controlador. El mtodo devuelve ActionResult que
lo debe generar la llamada a View().
Como comentario nos indica cmo podremos acceder a nuestro controlador.
Enrutamiento:
El enrutamiento ASP.NET permite usar direcciones URL que no es necesario
asignar a archivos especficos del sitio web, por lo tanto se pueden usar
direcciones URL que describan la accin del usuario y por tanto, sean ms
fciles de comprender.
(En una aplicacin que no usa enrutamiento, una slicitud entrante de una URL
se asigna a un archivo fsico que controla la solicitud, como un archivo .aspx )
Adems, en el enrutamiento de ASP.NET se se pueden incluir marcadores de
posicin en un modelo de direccin URL de modo que se puedan pasar datos
variables al controlador de solicitudes sin necesidad de una cadena de
consulta.
Los modelos de direccin URL para las rutas en las aplicaciones de MVC suelen
incluir los marcadores de posicin {controller} y {action}.
Por ejemplo, una direccin URL que incluye la ruta de acceso /Products est
asignada a un controlador denominado ProductsController. El valor del
parmetro action es el nombre del mtodo de accin que se invoca. Una
direccin URL que incluye la ruta de acceso /Products/show dara lugar a una
llamada al mtodo Show de la clase ProductsController.
Parmetros
Lo normal es que al menos en los mtodos de edicin, borrado o detalle
enviemos un parmetro, que puede ser el ID del modelo con el que trabaje el
controlador.
En ese caso lo ms sencillo es usar el parmetro por defecto que nos ofrece el
entorno que no es otro que ID.
public string Editar(int id)
{
return "Acceso al mtodo editar con el parmetro id a " +
id.ToString(CultureInfo.InvariantCulture);
}
Lo primero que nos preguntamos es, qu ha pasado con los parmetros por
QueryString?. No hay que preocuparse sigue funcionando igual, y se puede
Pasar ms de un parmetro
En ocasiones necesitaremos pasar ms de un parmetro al mtodo por
ejemplo el id y el tipo de salida:
public string Editar(int id, string salida)
{
return "Acceso al mtodo editar con el parmetro id a " +
id.ToString(CultureInfo.InvariantCulture) +
" y salida a " + salida;
}
Enrutamiento en MVC4
El proceso es muy parecido pero en ficheros diferentes. En MVC 4 no se usa
global.asax para estas funciones y se gestiona en el fichero RouteConfig.cs,
dentro de la carpeta App_Start.
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Aqu se define el formato
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
VISTA
Despus de crear el controlador debemos personalizarlo para visualizarlo:
public class DemoController : Controller
{
// GET: Demo
public ActionResult Index()
{
return View();
}
Aparece una ventana con muchas opciones, pero la mayora desactivadas. Las
opciones por defecto seleccionan el motor de trabajo Razor y que utilice layout
o master page. La dejamos tal cual y pulsamos Add.
Pulsando e botn derecho dentro del cdigo del mtodo y en esta ocasin
seleccionar Go To View
Ahora incorporamos cdigo para visualizar el mensaje. Con Razor se hace con
@NombreVariable o @NombreObjeto.Propiedad
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@ViewBag.Mensaje
CS
if(User.Type == admin) {
Response.Write (<span>Hola, + User.Username + </span>);
}
else {
Response.Write (<span>Debes identificarte para poder acceder a esta
seccin</span>);
}
Razor
En una sintaxis basada en C# (aunque se puede programar en Visual
Basic) que permite usarse como motor de programacin en las vistas o
plantillas de nuestros controladores. Es una de las novedades de ASP.NET
MVC 3.
No es el nico motor para trabajar con ASP.NET MVC. Entre los motores
disponibles
destaco
los
ms
conocidos:
Spark,
NHaml,
Brail,
StringTemplate o NVelocity, algunos de ellos son conversiones de otros
lenguajes de programacin.
Con ASP.NET MVC 4 se ha incorporado nuevas funcionalidades a Razor
que simplifican algunas tareas cotidianas
Tambin destacar que dispone IntelliSense dentro de Visual Studio con
lo que agiliza enormemente programar dentro de las vistas.
@{ var miVariable = valor; }
@{
var miVariable1 = valor1;
var miVariable2 = valor2;
Muestra de variables
<p>El valor de la variable es @miVariable</p>
Todos las variables que mostremos con @ son parseadas con HTML Encode.
Lo que hace es remplazar smbolos <, > o & por sus correpondientes cdigos.
De esta manera evitemos que nos introduzcan cdigo mal intencionado que
pueda alterar el comportamiento de nuesto programa.
Si lo que quiere mostrar est dentro de etiquetas HTML (por ejemplo span) se
puede escribir
@if(true)
{ <span>La hora es:
else
@DateTime.Now</span>
Comentarios
Se usa la etiquetas @* y *@ con el texto dentro.
@* Una lnea de comentario *@
@*
Ms de una lnea de comentario
Puede tener tantas como se necesiten
*@
ViewBag.Title = "Index";
}
@{
// Ttulo de la pgina
ViewBag.Title = "Index";
}
@{
/* Ttulo de la pgina
que se visualiza en la parte superior del navegador */
ViewBag.Title = "Index";
}
MODELO
El proceso de traspaso de informacin entre el controlador y la vista se puede
hacer interminable cuando queremos pasar mucha informacin. Para eso se
crea el modelo. Para crear un modelo nos vamos a la carpeta Models, y con el
botn derecho seleccionamos Agregar > Clase
Por ltimo dentro de la vista tenemos que indicar que tipo de datos vamos a
recibir. En la primera lnea aadimos
@model MVC_3.Models.Libro
El resultado es:
datos, en nuestro caso de libros. El proceso es muy similar, por una parte el
controlador deber enviar el listado de libros
public ActionResult Index()
{
var libros = new List<Libro>
{
new Libro {Isbn = "1122", Titulo = "El principito", TipoLibro = "Novela"},
new Libro {Isbn = "1122", Titulo = "Steve Jobs", TipoLibro = "Biografa"}
};
return View(libros);
}
Cuando tengamos que pasar un conjunto de datos a la vista podemos usar dos
tcnica crear un nuevo modelo que recoja todos los que se necesiten enviar (lo
recomendado) o usar el objeto ViewBag:
public ActionResult Index()
{
var libros = new List<Libro>
{
new Libro {Isbn = "1122", Titulo = "El principito", TipoLibro = "Novela"},
new Libro {Isbn = "1122", Titulo = "Steve Jobs", TipoLibro = "Biografa"}
};
ViewBag.Libros = libros;
return View();
}
Partial Views
Supongamos que estamos creando un sitio de e-commerce y tenemos una entidad llamada Producto
en nuestro modelo.
public class Producto
{
public int Codigo { get; set; }
public string Nombre { get; set; }
public string Descripcion { get; set; }
public decimal Precio { get; set; }
}
Tambin tenemos un controller con una accin que muestra una lista de productos.
public class ProductoController : Controller
{
// GET: Producto
public ActionResult Index()
{
List<Producto> productos
{
new Producto {Codigo
"Producto 1", Precio = 100m},
new Producto {Codigo
"Producto 2", Precio = 200m},
new Producto {Codigo
"Producto 3", Precio = 300m},
new Producto {Codigo
"Producto 4", Precio = 400m}
};
return View(productos);
}
}
= new List<Producto>()
= 1, Descripcion = "Descripcin 1", Nombre =
= 2, Descripcion = "Descripcin 2", Nombre =
= 3, Descripcion = "Descripcin 3", Nombre =
= 4, Descripcion = "Descripcin 4", Nombre =
Hasta ac todo perfecto, el problema comienza cuando tenemos que mostrar los productos en otra
vista (por algn motivo) y tenemos que volver a escribir todo el cdigo de la vista que los est
mostrando.
Cuando necesitamos reutilizar fragmentos de Razor y HTML en varios lados, nos conviene usar
En esta vista parcial vamos a copiar el cdigo que est dentro del foreach de la vista anterior:
@model Ejemplo.Models.Producto
<div style="background-color:lightblue; text-align: center; padding-bottom:
10px">
Codigo: <span>@Model.Codigo</span>
Name: <span>@Model.Nombre</span>
Description: <span>@Model.Descripcion</span>
Price: <span>@Model.Precio</span>
</div>
Para utilizar esta vista parcial es necesario que en la vista llamemos al helper Html.Partial. Este
mtodo espera que pasemos como primer argumento el nombre de la vista parcial y como segundo
un modelo.
@model List<Ejemplo.Models.Producto>
@{
ViewBag.Title = "Productos";
}
<h2>Productos</h2>
@foreach (var producto in Model)
{
@Html.Partial("DetalleProducto", producto)
}
Si probamos la aplicacin veremos que sigue todo funcionando igual, la diferencia es que ahora
podemos reutilizar esta vista parcial llamndola desde diferentes lugares. Si queremos modificar la
forma de mostrar los productos, slo tendremos que tocar un archivo y se reflejar en todos lados al
mismo tiempo.
Child Actions
Las Child Actions son a las acciones, lo que las Partial Views son a las vistas. En general las Child
Actions se utilizan para renderizar pequeas partes de una pgina, en lugar de una vista entera.
Es posible llamar a una Child Action desde una vista utilizando el helper Html.Action.
Vamos a crear un Child Action dentro de nuestro controller.
[ChildActionOnly]
public ActionResult MostrarProducto(Producto producto)
{
return PartialView("DetalleProducto", producto);
}
Este mtodo va a estar renderizando una vista parcial en lugar de una vista comn, es por eso que el
valor de retorno es PartialView y no View. Adems, se marca a la accin con el atributo
ChildActionOnly. De esta forma nos aseguramos que no pueda accederse a esta accin a travs de
la url.
Ahora tenemos que modificar nuestra vista para que llame a la accin en lugar de la vista parcial.
@model List<Ejemplo.Models.Producto>
@{
ViewBag.Title = "Productos";
}
<h2>Productos</h2>
@foreach (var producto in Model)
{
@Html.Action("MostrarProducto", producto)
}
La aplicacin va a seguir funcionando, con la diferencia que ahora podemos tener mayor
manipulacin de los datos. Por ejemplo, podramos cambiar los valores en la Child Action antes de
renderizarlos.
VALIDACION BSICA
Atributos:
PERSONALIZACIN DE MENSAJES
[RegularExpression(@"^[0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@(ua)\.(es)$",
ErrorMessage = "El formato del correo no se corresponde con uno de la Universidad
de Alicante.")]
public string Email { get; set; }
Ya vimos como personalizar las descripciones en diferentes idiomas con los ficheros de recursos.
Para hacerlo con los mensajes de error podemos aplicar la misma tcnica, indicamos en
ErrorMessageResourceType = typeof([carpeta de recursos].[nombre fichero de recursos sin
extension]) y en ErrorMessageResourceName = [Nombre de la clave dentro del fichero de
recursos].
[RegularExpression(@"^[0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@(ua)\.(es)$",
ErrorMessageResourceType = typeof(Resources.Alumno),
ErrorMessageResourceName = "ErrorFormatoCorreoUA")]
[Required(ErrorMessageResourceType = typeof(Resources.Resources),
ErrorMessageResourceName = "PasswordRequired")]
public string Email { get; set; }
Vistas Parciales
Sirven para crear componentes visuales mediante HTML. Ejemplo:
Creemos un archivo llamado ListadoEnumerable.cshtml en la carpeta: Views/Shared. Sobre la
carpeta hacemos click derecho Add -> View. Ponemos el nombre y damos click en Crear como vista
parcial (Create as partial view).
Nos crear un archivo vaco. Ahora agreguemos este cdigo que bsicamente espera un modelo
IEnumerable de tipo Object y utiliza el mtodo toString() para imprimir la lista en pantalla:
@model IEnumerable<Object>
@if (Model != null)
{
<div class="grid">
<table>
<thead>
<tr>
<th>Nombre</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.ToString()</td>
</tr>
}
</tbody>
</table>
</div>
}
Vista Parcial
Para obtener esto debern modificar el mtodo Index del HomeController y tener algo as:
1
2
3
4
5
6
7
8
9
10
11
return View(listado);
}
Con esos cambios deberan ver el poder obtener el mismo resultado de la imagen.