Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ASP.NET MVC 3 y 4
PERSONALIZACIN 2
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es/
4 DA PERSONALIZACIN 2
ENTITY FRAMEWORK VISTAS Y PAQUETES
Hasta el momento cuando trabajamos con base de datos, hemos accedido a las tablas directamente.
Una buena costumbre es crear vistas para el acceso a los datos y as evitar el acceso a las tablas, y
paquetes para la gestin de las tablas.
En el caso de las vistas, si estn bien hechas, nos olvidamos del tema de tener que hacer includes
dentro de nuestra consulta, porque en la mayora de los casos tendremos esos campos que
queremos mostrar en la propia vista.
En cuanto a los paquetes debemos crear un procedimiento para las 3 operaciones bsicas: insercin,
actualizacin y borrado. Aunque estamos acostumbrados a integrar la insercin y la actualizacin en
una, para EF las vamos a dividir en dos ALTA_LIBRO y MODIF_LIBRO.
Si queremos lo probamos desde el propio SQL Developer, y si todo es correcto, vamos al Visual
Studio, a la entidad (en nuestro caso ModelBiblioteca.edmx) y pulsamos botn derecho > Actualizar
modelo desde base de datos
Ahora debemos asociar cada operacin a un procedimiento. Nos situamos en la tabla CSI_TABLA,
pulsamos el botn derecho y seleccionamos Asignacin de procedimientos almacenados.
En la parte inferior del Visual Studio nos aparece un panel para poder hacer la asociacin.
Pulsamos sobre <Seleccionar Insert Function> y aparece un desplegable con todos los
procedimientos que tengamos. Seleccionamos PKG_CSI_ALTA_LIBRO. Todos los parmetros
aparecen disponibles para su asignacin, vamos uno a uno asignando. En el nico que hay que tener
cuidado es en TIPOLIBRO porque aparecen dos posibilidades CSI_TIPOLIBRO.ID (que es la relacin
entre las tablas) y TIPOLIBRO. Es este segundo campo el que debemos seleccionar.
Por tanto debe quedar de la siguiente manera la asignacin.
Para poder probarlo deberamos quitarnos los permisos de escritura en la tabla y darnos de
ejecuacin en el paquete. Otra forma es incluir una tabla de log y cuando hagamos cualquier
operacin en un procedimiento escriba en ella.
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
Creamos la tabla CSI_LOG con al menos un campo para el mensajey otro para la fecha. Por defecto
ponemos el valor de fecha a sysdate.
Ahora dentro del procedimiento de alta, despus de aadir e libro incluimos una entrada en el log.
INSERT INTO CSI_LOG (MENSAJE) VALUES ('Alta de un nuevo libro: ' || PTITULO);
Ahora compilamos el proyecto, y al dar de alta un nuevo libro, por cada operacin debe aparecer una
entrada en el fichro de Log.
El usar una vista en EF es muy sencillo. La creamos con Oracle SQL Developer. Accedemos a la
entidad en el proyecto (en nuestro caso ModelBiblioteca.edmx) y pulsamos botn derecho >
Actualizar modelo desde base de datos
Un problema con el que nos podemos encontrar es con la deteccin de claves primarias en la vista.
En este caso pone claves primarias a muchos campos que no lo son. Nos ponemos sobre cada campo
y con e botn derecho desmarcamos clave de entidad. De no hacerlo, todos aquellos campos que
son clave los oculta en los listados, en la gestin, etc.
Para probarla vamos a crear un nuevo controlador libro2 que trabaje con esta vista. Para que la
reconozca el controlador, vamos a compilar el proyecto con F6 y seguimos el proceso de otras
ocasiones, botn derecho sobre carpeta Controllers > Agregar > Controlador
Lo probamos y vemos que aparecen todos los campos de la vista. Como el Id del tipo de libro no me
interesa mostrarlo, podemos modificar las vistas para que no lo solicite.
.
A primera vista parece que nos ha generado lo mismo que con las tablas, pero qu campos nos
muestra cuando queremos editar o crear un libro? Pues todos los de la vista incluyendo el id y la
descripcin del tipo de libro (como era lgico). En este caso no queremos ni el id ni la descripcin,
necesitamos un desplegable con los tipos y que podamos seleccionar el que nos interese.
Aqu tenemos que programar un poco. Comenzamos con el de editar. Accedemos al controlador y
despus de cargar el libro desde la vista
VCSI_LIBRO vcsi_libro = db.VCSI_LIBRO.Single(v => v.ID_LIBRO == id);
Vamos a cargar todos los tipos de libros (aun lo seguimos haciendo con tablas pero lo normal es que
fuera otra vista) y vamos a indicar cual est seleccionado. Usamos el objeto SelectList y le pasamos 4
parmetros, el origen de datos (la tabla), el campo que muestra los valores (Id), el campo que
muestra el texto visible en el desplegable (Descripcion) y por ltimo cul est seleccionado. Como
acabamos de leer el libro en vcsi_libro, pues vcsi_libro.ID_TIPOLIBRO.
Lo vamos a pasar por el objeto ViewBag y como propiedad el nombre del campo.
ViewBag.ID_TIPOLIBRO = new SelectList(db.CSI_TIPOLIBRO, "ID", "DESCRIPCION", vcsi_libro.ID_TIPOLIBRO);
Ahora es el momento de acceder a la vista crate.html y modificar ID_TIPOLIBRO para que sea un
desplegable y que adems reciba los datos de ViewBag. ID_TIPOLIBRO.
<div class="editor-label">
@Html.LabelFor(model => model.ID_TIPOLIBRO)
</div>
<div class="editor-field">
@Html.DropDownList("ID_TIPOLIBRO")
@Html.ValidationMessageFor(model => model.ID_TIPOLIBRO)
</div>
Se puede ver que slo hemos tenido que cambiar el tipo de helper y que poniendo el nombre de la
propiedad de Viewbag ha sido capaz de asociarlo sin tener que incluir nada ms de cdigo.
Si quisiramos poner en el desplegable un primer elemento que indique que se debe seleccionar un
tipo de libro
EJEMPLO: VOTACIN
En ms de una ocasin habremos visto pginas que nos permiten valorar un artculo, el servicio que
nos han ofrecido, etc.
Vamos a tratar de implementarlo con MVC. Siguiendo el ejemplo del libro vamos a permitir valorar el
libro en el momento que vemos el detalle de ste.
Vamos a aadir al modelo 3 campos que sern el voto actual, el nmero de votos realizados hasta el
momento y la valoracin acumuladada.
public int Puntuacion { get; set; }
public int NumeroPuntuaciones { get; set; }
public double MediaPuntuaciones { get; set; }
Ahora en la vista detalle aadimos un conjunto de botones radio que nos permitan seleccionar la
valoracin. Nosotros vamos a permitir del 1 al 5.
<div class="display-label">Valorar</div>
<div class="display-field">
<input type="radio" name="score" value="1"/>1
<input type="radio" name="score" value="2"/>2
<input type="radio" name="score" value="3"/>3
<input type="radio" name="score" value="4"/>4
<input type="radio" name="score" value="5"/>5
<br />
<input type="submit" value="Votar"/>
</div>
Ahora nos falta el paso ms importante, poder votar. Modificamos la plantilla para que el formulario
en el submit (que esta plantilla por defecto no tiene) llame a la accin Votar.
@using (Html.BeginForm("Votar", "Biblioteca", FormMethod.Get))
{
@Html.HiddenFor(model => model.Id)
Tambin hemos incluido como campo oculto el id del libro porque si no luego no podemos asociarlo.
La accin Votar lo que hace es accede al libro, actualizar las puntuaciones y volver a mostrar el
detalle del libro, por eso en el return de la vista inclumos como primer parmetro la vista Details.
public ActionResult Votar(int id, int score)
{
var libro = miBiblioteca.ObtenerPorId(id);
libro.NumeroPuntuaciones++;
libro.Puntuacion += score;
libro.MediaPuntuaciones = Convert.ToDouble(libro.Puntuacion) /
Convert.ToDouble(libro.NumeroPuntuaciones);
return View("Details", libro);
}
Lo primero es incluir la librera JavaScrit y la hoja de estilo. Las imgenes de la estrella y la de limpiar
el valor de tu votacin deben estar en la misma carpeta que la hoja de estilo.
Hacemos referencia desde nuestra plantilla:
<link href="@Url.Content("~/Content/jquery.rating.css")" rel="stylesheet" type="text/css"
/>
<script src="@Url.Content("~/Scripts/jquery.rating.pack.js")"
type="text/javascript"></script>
Incluimos el estilo star a los campos radio y quitamos la numeracin asociada a cada campo.
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
El helper lo nico que comprueba es que la media est en el rango que le pasamos. En ese caso
escribe que est activado.
@helper Check(double lower, double upper, double toCheck) {
if (toCheck > lower && toCheck <= upper)
{
<text>checked="checked" </text>
}
}
El resultado es que si la media es 3,5, al acceder al detalle del libro estar marcada hasta la cuarta
estrella.
REQUIRED
Indicamos que el campo es obligatorio
[Required]
public string Email { get; set; }
STRINGLENGTH
Indicamos el nmero mximo de caracteres que se puede escribir en ese campo. Es una forma de
evitar el mensaje de desbordamiento que se produce en el momento que sobrepasamos el tamao
permitido.
[StringLength(200)]
public string Email { get; set; }
REGULAREXPRESSION
En caso de que queramos que la informacin que se introduzca cumpla unos criterios, podemos usar
las expresiones regulares. Por ejemplo si queremos que el correo sea de la Universidad de Alicante
usaramos.
[RegularExpression(@"^[0-9a-zA-Z]([-\\.\\w]*[0-9a-zA-Z])*@(ua)\\.(es)$")]
public string Email { get; set; }
RANGE
Limitamos un valor mnimo y mximo para un determinado valor. Si queremos que solo se puedan
seleccionar entre 2 y 10 asignaturas usaramos.
[Range(2, 10)]
public int Asignaturas { get; set; }
PERSONALIZACIN DE MENSAJES
Aunque los mensajes de error son bastantes explicitos, lo ms normal es que los personalicemos. La
forma de hacerlo es incluir dentro del propio atributo con ErrorMessage = "Texto del mensaje". Se
separa con una , (coma).
[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.")]
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
10
Si queremos mostrar dentro del mensaje alguno de los valores por los que se personaliza (por
ejemplo el tamao mximos) aparezca sin tener que introducirlo de nuevo, le hacemos referencia
con {posicin donde se encuentra el valor}.
[StringLength(200, ErrorMessage = "El nombre no puede ser mayor de {0} caracteres.")]
public string NombreCompleto { 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; }
11
Currency. Muestra a cantidad como moneda del pas. En nuestro caso pospone el smbolo del
euro.
ImageUrl. Muestra el valor como una direccin a una imagen.
Lo que nos llama la atencin cuando comencemos a probarlo, es que la mayora no tienen ningn
efecto en la visualizacin. Maana veremos como personalizar la apariencia de un campo y
remplazaremos un campo de fecha por un calendario generador con JQuery.
Tambin hemos incluido un constructor al que le podemos pasar un valor (nuestro caso el nmero
mximo de alumnos por clase) y poder tener el mensaje de error por defecto, aunque en cualquier
momento lo podramos cambiar por otro con:
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
12
La validacin es muy bsica y lo que hace es comprobar que el tipo de dato es numrico. No hara
falta esta comprobacin ya que el validador de tipo de dato lo capturara y mostrara un error de que
debe ser un nmero. Luego comprueba si es mayor, y en caso de serlo, formatea el mensaje de error
para que lo muestre con el nombre del campo.
Para incluirlo en nuestro modelo incluiramos referencia a la carpeta con validadores
using NombreProyecto.Models.Validacion;
13
Me imagino que a ms de uno le habr llamado la atencin la instruccin yield y se habr preguntado
si se pueden comprobar y devolver ms de un error.
La respuesta es que s y la razn es la instruccin yield. El mtodo devuelve un conjunto de
ValidationResult y yield lo que permite es ir concatenando returns. Es decir que si hacemos 3
comprobaciones y cada uno hace el return con yield, al final el mtodo, en caso de que hayan fallado
las 3 comprobaciones, devolver un IEnumerable<ValidationResult> con 3 ValidationResult.
14
JQUERY (BSICO)
JQuery es una de las libreras de programacin ms sencillas y potentes que podemos encontrar hoy
en da. El objetivo en este curso es que entendis cdigo escrito con este Framework y que sepis
crear aplicaciones muy sencillas.
ASP.NET MVC usa esta librera de base (la podemos encontrar en la carpeta Scripts) y la mayora de
los plugins que encontramos por Internet hace uso de ella.
La plantilla que tiene por defecto ASP.NET MVC la incluye con lo que podemos utilizarla en nuestras
vistas sin ningn problema.
La tarea ms comn en JQuery es acceder a algn elemento de nuestra pgina modificar sus
propiedades o contenido y que se actualice antes de que se visualice la pgina al usuario.
Nos vamos a centrar en estos puntos y cada da iremos incorporando nuevas caractersticas.
SELECTORES
Jquery dispone de varios mtodos para acceder a los elementos de nuestra pgina. Vamos a analizar
los ms comunes. Todos ellos utilizan la funcin $([selector]). Si nunca se ha programado con
JQuery o Mootools nos llamar la atencin que se use el $ como funcin para acceder a los
elementos de nuestra pgina.
En caso de que trabajemos con JQuery y Mootools, y hagamos referencia a ambas libreras desde
nuestras pginas, se producir un conflicto por la funcin $ que ambas usan. Para solucionarlo
JQuery ofrece una solucin muy sencilla.
Incluimos la instruccin jQuery.noConflict(); para indicar que desde este momento para hacer
uso del selector en JQuery vamos a utilizar jQuery ([selector]) en vez de $([selector]).
De esa manera ya no interfiere con Mootools que lo sigue utilizando sin problemas.
Vamos a analizar los selectores ms comunes
$(#ID)
Seleccionamos un elemento HTML por el id que tenga. Es muy normal usarlo en elementos muy
comunes de nuestra pgina cabecera, cuerpo, noticias o pie, aunque si somos cuidadosos con los ids,
podemos usarlo en cualquier elemento que queramos.
Por ejemplo si tenemos una capa div con id igual a capa_1
<div id="capa_1"></div>
15
Ahora podramos hacer cualquier operacin con este elemento, que es un objeto que dispone de
mtodos / funciones que iremos viendo.
$(ELEMENTO)
En ocasiones nos interesa que todos los elementos HTML de un tipo (por ejemplo los enlaces)
cambien alguna propiedad que no es accesible (el ejemplo ms claro es que se abran en un nueva
ventana).
Tenemos un listado de enlaces
<div id="capa_2">
<a href="1">Enlace 1</a><br />
<a href="2">Enlace 2</a><br />
<a href="3">Enlace 3</a><br />
<a href="4">Enlace 4</a><br />
</div>
Un error comn cuando comenzamos con JQuery es que creemos que el elemento el es el propio
elemento HTML y que por tanto accedo a sus atributos con el.target = "_blank";. Si lo probis veris
que no es as, porque el es un objeto JQuery y no un enlace. Debemos usar los mtodos que nos
ofrece JQuery para estas tareas.
$(.CLASE) O $(ELEMENTO.CLASE)
Un paso ms en la seleccin es que no accedamos a elementos tan genricos si no a aquellos que
nosotros marquemos con un estilo determinado. El ejemplo anterior sera mejor si slo lo
aplicramos a aquellos enlaces que pertenezcan a la clase externo.
Modificamos el listado anterior para indicar que dos son externos y otros dos no.
<div id="capa_2">
<a class="externo" href="1">Enlace 1</a><br />
<a href="2">Enlace 2</a><br />
<a class="externo" href="3">Enlace 3</a><br />
<a href="4">Enlace 4</a><br />
</div>
Para acceder a estos dos enlaces no podemos usar el genrico de elementos porque cogeramos los
4, usamos:
var els = $("a.externo");
o en caso de que slo se use esta clase con enlaces y no haya confusin con otros elementos
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
16
Otro ejemplo muy comn es crearnos un estilo obligatorio que realice determinadas operaciones
sobre los elementos (cambiar color, poner en negrita, aadir un asterisco para indicar que es
obligatorio, etc.).
var els = $(".obligatorio");
HIJOS O DESCENDENTE
Ahora es el momento de combinar selectores
$(#cabecera a)
Selecciona todos los enlaces que hay dentro de el elemento con id igual a cabecera da lo mismo
que estn en el siguiente nivel de cabecera o dentro de otros elementos. En
<div id="cabecera" style="margin-top: 20px;">
<a href="1">Enlace 1</a><br />
<a href="2">Enlace 2</a><br />
<div id="subcabecera" style="margin-top: 10px;">
<a href="3">Enlace 3</a><br />
<a href="4">Enlace 4</a><br />
</div>
</div>
$(#cabecera > a)
Si solo queremos modificar los 2 enlaces hijo y descartar otros descendientes que pertenecen a otro
elemento.
var els = $("#cabecera > a");
els.each(function () {
var el = $(this);
el.attr("style", "color: red");
});
Slo cambia el color a los dos primeros enlaces que son hijos directos de cabecera.
17
FUNCIONES
Un problema que nos podemos encontrar con JavaScript es el momento de inicializar los elementos
de HTML porque hasta que no se acaba el cdigo, no tenemos a nuestra disposicin a todos los
elementos.
Una buena costumbre es poner al final del HTML todos los ficheros que hacen referencia a
JavaScript. La razn principal es que la persona ya puede comenzar a visualizar la pgina en ese
momento y no debe esperar a que se carguen todos los ficheros JavaScript que en ocasiones, si
hacen referencia a direcciones externas, pueden producir un retardo molesto.
Adems de esta tcnica que usaremos en nuestras plantillas, jQuery tiene dos mtodos de ejecutar
cdigo en el momento que el Modelo de Objetos del Documento (DOM) est disponible:
$(DOCUMENT).READY
http://api.jquery.com/ready/
Le indicamos la funcin que se ejecutar en el momento de estar listo el DOM.
En el siguiente ejemplo actualizar el contenido de un elemento con id igual a capa_1.
Independiente de que este cdigo est al principio o al final no dar error porque no se ejecuta en el
momento de leerse el JavaScript.
$(document).ready(function () {
var el = $("#capa_1");
el.html("Aadimos un texto");
});
$(FUNCTION () { });
Tiene el mismo comportamiento que la anterior. Cuando se pasa una funcin como primer
parmetro, le indicas a jQuery que lo ejecute cuando est disponible el DOM. El ejemplo anterior
sera:
$(function () {
var el = $("#capa_1");
el.html("Aadimos un texto");
});
ARRAYS
Aplicar una funcin a un array es una tarea muy comn. Lo hemos visto cambiando el
comportamiento de los enlaces. Se usa mucho para asignar eventos que no por accesibilidad no
estn permitidos dentro del cdigo HTML.
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
18
CONTENIDO
Disponemos dos formas muy sencillas para modificar el contenido de un elemento.
HTML
http://api.jquery.com/html/
Nos deja remplazar el cdigo o texto que hay en ese el elemento por el que le indiquemos. Permite
cdigo con etiquetas HTML.
el.html("Aadimos un texto en <strong>negrita</strong>");
TEXT
http://api.jquery.com/text/
Parecido al anterior pero slo para remplazar con texto sin formato. Ambas funciones tambin
permite leer el contenido si no se le enva ningn parmetro. En el caso de text, si lo que lee tiene
etiquetas HTML las elimina.
var texto = el.text();
APPEND
http://api.jquery.com/append/
En caso de que el elemento ya tenga contenido, no lo remplaza, lo escribe detrs del contenido
actual.
PREPEND
http://api.jquery.com/prepend/
En caso de que el elemento ya tenga contenido, no lo remplaza, lo escribe antes del contenido
actual.
19
LOAD
http://api.jquery.com/load/
Podemos cargar el contenido desde otra pgina. Lo normal, y como ya hicimos el 2 da es que lo
hagamos desde una accin de nuestros controladores.
Por ejemplo si queremos cargar el contenido de la accin Contenido de nuestro controlador Home,
ejecutaramos:
el.load("/Home/Contenido");
El resultado es
PROPIEDADES
ATTR
http://api.jquery.com/attr/
En ocasiones lo que nos interesa no es aadir contenido si no modificar alguna propiedad, por
ejemplo el color o poner en negrita por si queremos destacar algo.
el.attr("style", "color: red; font-weight: bold;");
20
Hoy slo vamos a realizar dos operaciones bsicas, aadir y eliminar tareas. Maana le incluiremos
ciertos eventos con jQuery para hacerla ms vistosa, incluiremos la opcin de editar y por ltimo la
integraremos en AJAX.
El proceso es siempre el mismo crear un modelo / tabla, crear el controlador y crear vistas.
MODELO
TAREA
public class Tarea
{
[Key]
public int Id { get; set; }
public string Descripcion { get; set; }
public DateTime FechaCrea { get; set; }
public DateTime FechaMod { get; set; }
}
TODO
public class ToDo
{
public List<Tarea> Tareas;
public ToDo()
{
Tareas = new List<Tarea>
{
new Tarea {Id=1, Descripcion = "Crear proyecto", FechaCrea = DateTime.Now, FechaMod = DateTime.Now},
new Tarea {Id= 2, Descripcion = "Crear modelo", FechaCrea = DateTime.Now, FechaMod = DateTime.Now},
new Tarea {Id=3, Descripcion = "Crear controlador", FechaCrea = DateTime.Now, FechaMod =
DateTime.Now},
new Tarea {Id=4, Descripcion = "Crear vistas", FechaCrea = DateTime.Now, FechaMod = DateTime.Now},
};
}
}
21
Para porder realizar ciertas operaciones con las tareas inclmos los siguientes mtodos a ToDo:
public Tarea ObtenerxId(int id)
{
return Tareas.Where(t => t.Id == id).FirstOrDefault();
}
public void BorrarTareaxId(int id)
{
Tarea tareaBorrar = ObtenerxId(id);
if (tareaBorrar != null)
Tareas.Remove(tareaBorrar);
}
public void BorrarTarea(Tarea tarea)
{
if (tarea != null)
Tareas.Remove(tarea);
}
public void InsertarTarea(string descripcion)
{
Tareas.Add(new Tarea {Id=Tareas.Max(t => t.Id) + 1, Descripcion = descripcion, FechaCrea = DateTime.Now,
FechaMod = DateTime.Now});
}
Compilamos el proyecto con F6 para que las clases sean visibles por el resto de elementos del
proyecto y creamos un controlador para la clase ToDo.
CONTROLADOR
Al menos implementamos Index, Create (GET y POST) y Delete (GET y POST)
public ActionResult Index()
{
//Todo.BorrarTarea(1);
return View(Todo.Tareas);
}
public ActionResult Create()
{
ViewBag.ListadoTareas = Todo.Tareas;
return View();
}
//
// POST: /ToDo/Create
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
Todo.InsertarTarea(collection["Descripcion"]);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Delete(int id)
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
22
Las acciones hacen uso de los mtodos la clase ToDo, dejando un cdigo muy limpio y fcil de
entender.
VISTAS
El ltimo paso es crear las vistas para cada una de las acciones.
Antes debemos el layout por el de la pgina original para incorporar el estilo. Nos descargamos el
cdigo de la web. De algn PHP nos quedamos con el cdigo HTML y eliminamos todo lo que haga
referencia a PHP.
Modificamos las referencias a JavaScript y hojas de estilo.
En la cabecera las hojas de estilo.
<link href="@Url.Content("~/Content/themes/base/jquery.ui.theme.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/styles.css")" rel="stylesheet" type="text/css" />
Como todas las plantillas de MVC debemos incluir @RenderBody(). En caso de no hacerlo nos dar
un error cuando queramos hacer uso de la plantilla.
Ahora ya podemos crear las vistas con las plantillas que nos ofrece MVC.
Es importante que para que obtengamos el formato original respetemos estilos y elementos que lo
formen. Como ya conocemos como crear nuestros propios helpers, vamos a usarlos para dar formato
a las etiquetas de visualizacin y creacin de tareas.
@helper Tarea(string nombre, int id)
Andrs Valls Botella | Analista | Desarrollos propios
Servicio de Informtica | Universidad de Alicante
Campus de Sant Vicent del Raspeig | 03690 | Espaa
http://si.ua.es/es
23
24
En la parte izquierda podemos seleccionar las extensiones que tenemos instaladas, buscar en la red
(Galera en lnea) o revisar si hay actualizaciones.
Si buscamos en la galera por el trmino mvc y tenemos ordenado por Mejor clasificado,
obtendremos un resultado parecido al que se visualiza en la imagen
25
26
Nos instala la referencia y un fichero css. Aadimos la hoja de estilo a nuestra plantilla.
<link href="@Url.Content("~/Content/PagedList.css")" rel="stylesheet" type="text/css" />
Modificamos el controlador Index para que permita recibir la pgina que queremos mostrar. Ser un
campo opcional porque en la primera llamada no se indicar.
Disponemos un nuevo mtodo ToPagedList que podemos pasar a nuestra lista de libros, en la que le
indicamos la pgina actual y el nmero de resultados por pgina. El resultado de ese filtro es el que
pasaremos por ViewBag a la vista.
public ActionResult Index(int? page)
{
var pageNumber = page ?? 1;
var onePageOfProducts = biblioteca.Libros.ToPagedList(pageNumber,
ResultadosxPagina);
ViewBag.Message = "ASP.NET MVC";
ViewBag.OnePageOfProducts = onePageOfProducts;
return View();
}
No hace falta que tenga formato de tabla. Esta es la gran ventaja de PagedList, lo podemos aplicar a
cualquier elemento.
Por ultimo incumos un control para paginar. Para eso disponemos del helper PagedListPager al que
le pasamos los datos a mostrar y la accin que va a realizar.
@Html.PagedListPager( (IPagedList)ViewBag.OnePageOfProducts, page =>
Url.Action("Index", new { page }) )
27
El resultado es el siguiente
28
Aadimos la clase
@Html.TextBoxFor(model => model.Titulo, new { @class = "editor-html" })
El Helper EditorFor no permite aadir atributos como @class, esa es la razn de que lo
remplacemos por TextBoxFor que admite como segundo parmetro una relacin de atributos.
Ahora en algn fichero que dispongamos de JavaScript que incluyamos en nuestro proyecto,
indicamos que todos los elementos que tengan el estilo editor-html van a transformarse en un
editor TinyMCE.
jQuery('.editor-html').tinymce({
script_url: '/Scripts/tinymce/tiny_mce.js',
theme: "advanced",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : "bottom",
theme_advanced_resizing : true,
});
El resultado es
29
30
Instala la validacin del lado del cliente como del lado del servidor. Vamos a realizar un ejemplo muy
sencillo que compruebe que estamos insertando una direccin Url.
public class Libro
{
[Key]
public int Id { get; set; }
public string Isbn { get; set; }
public string Titulo { get; set; }
public string TipoLibro { get; set; }
[Url]
public string UrlMasInfo { get; set; }
}
En la plantilla incluimos estos dos ficheros jQuery para la validacin de formularios. Normalmente ya
se incluye en algunas vistas como por ejemplo Create.cshtm
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
Volvemos a generar la vista para que aada el nuevo campo o smplemente aadimos lo nuevo a la
vista actual.
<div class="editor-label">
@Html.LabelFor(model => model.UrlMasInfo)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UrlMasInfo)
@Html.ValidationMessageFor(model => model.UrlMasInfo)
</div>
31
El texto del error se puede modificar como en cualquier otro atributo, al igual que se pueden
combinar atributos.
[StringLength(150)]
[Url(ErrorMessage="Introduzca una direccin vlida (http o ftp)") ]
public string UrlMasInfo { get; set; }
PROYECTO
CREAR VISTAS Y PAQUETE, MODELOS COMPLEJOS, CONTROLADORES Y HELPERS
DE LOS NUEVOS TIPOS.
32