martes, 1 de septiembre de 2015

Post 14. Helpers (IV) Hidden y TextArea

@Html.Hidden / @Html.HiddenFor 

Este helper nos sirve para crear la etiqueta hidden, con la cual podremos crear campos con valores "ocultos". Generalmente utilizados para enviar datos que no deben ser mostrados al usuario, pero que son necesarios para el objeto, por ejemplo el ID del objeto.

Ahora veamos sus principales constructores:

@Html.Hidden(name)
@Html.Hidden(name,value)
@Html.Hidden(name,value,htmlAttributes)

@Html.HiddenFor(expression)
@Html.HiddenFor(expression,htmlAttributes)

AtributoTipo DatoDescripción
nameStringValor que se le dará al atributo name. Si no se especifica el valor del atributo id tendrá el mismo valor name
valueStringValor que se le dará al atributo value. Si no se especifica tendra el valor ""
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.
m => m.atributoObjectPredicado que indica el el valor de los atributos name y value (tambien el de id si no se especifica). La variable m (puede utilizarse cualquier nombre) representa a la clase especificada en el modelo. Según la propiedad del modelo que utilicemos el atributo name tendrá como valor el nombre de la propiedad y el atributo value tendrá como valor el valor del atributo.
Agregaremos el siguiente código a nuestra accion Hidden , controller Home:
public ActionResult Hidden() {
    DetalleLibroViewModel model = new DetalleLibroViewModel();
    model.Libro = new LibroModel(2, "Paco Yunque", 4, 5);
    return View(model);
}
Y en nuestra vista agregaremos el siguiente código:
@model Helpers.Models.DetalleLibroViewModel
@{
    ViewBag.Title = "Hidden";
}

<h2>Hidden</h2>
@Html.Hidden("ValorOculto")
@Html.Hidden("IdRegistro","451")
@Html.Hidden("FechaRegistro", DateTime.Now.ToString("yyyyMMdd"), new { id = "FechaReg"})

@*Simulamos un formulario en que solo se edita el nombre pero se coloca el id en un campo hidden para usar como referencia en la actualización*@
<h3>Actualizar Datos del Libro:</h3>
@Html.HiddenFor(m => m.Libro.id)
@Html.HiddenFor(m => m.Libro.Autor.id, new { id = "IDENT_AUTOR"})
@Html.LabelFor(m => m.Libro.Nombre): @Html.TextBoxFor(m => m.Libro.Nombre)

Al ejecutar nuestro código tendremos lo siguiente:


El código generado por nuestro ejemplo es:
<h2>Hidden</h2>
<input id="ValorOculto" name="ValorOculto" type="hidden" value="" />
<input id="IdRegistro" name="IdRegistro" type="hidden" value="451" />
<input id="FechaReg" name="FechaRegistro" type="hidden" value="20150626" />
<h3>Actualizar Datos del Libro:</h3>
<input id="Libro_id" name="Libro.id" type="hidden" value="2" />
<input id="IDENT_AUTOR" name="Libro.Autor.id" type="hidden" value="4" />
<label for="Libro_Nombre">Nombre</label>: <input id="Libro_Nombre" name="Libro.Nombre" type="text" value="Paco Yunque" />


@Html.TextArea / @Html.TextAreaFor

Este tipo de helper nos permite crear un TextArea, cuya funcionalidad es similar a los TextBox, solo que estos se utilizan generalmente para textos más grandes como parrafos, ya que nos permite ingresar saltos de línea.

Veamos sus principales constructores:

@Html.TextArea(name)
@Html.TextArea(name, htmlAttributes)
@Html.TextArea(name, value)
@Html.TextArea(name, value, htmlAttributes)
@Html.TextArea(name, value, rows, columns, htmlAttributes)

@Html.TextAreaFor(m => m.atributo)
@Html.TextAreaFor(m => m.atributo, htmlAttributes)
@Html.TextAreaFor(m => m.atributo, rows, columns, htmlAttributes)


AtributoTipo DatoDescripción
nameStringValor que se le dará al atributo name. Si no se especifica el valor del atributo id tendrá el mismo valor name
valueStringValor que se le dará al atributo value. Si no se especifica tendra el valor ""
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.
m => m.atributoObjectPredicado que indica el el valor de los atributos name y value (tambien el de id si no se especifica). La variable m (puede utilizarse cualquier nombre) representa a la clase especificada en el modelo. Según la propiedad del modelo que utilicemos el atributo name tendrá como valor el nombre de la propiedad y el atributo value tendrá como valor el valor del atributo.
rows, columnsObjectIndica el valor del atributo rows y columns (filas y columnas).

Para probar este helper primero agregaremos el siguiente código a nuestro modelo LibroModel:
public string Descripcion { get; set; }
Y dentro de nuestro Controller agregamos lo siguiente:
public ActionResult TextArea() {
    DetalleLibroViewModel model = new DetalleLibroViewModel();
    model.Libro = new LibroModel(2, "Cien Años de Soledad", 3, 1);
    model.Libro.Descripcion = "La historia transcurre en un pueblo llamado Macondo, el cuál fue (...)";
    return View(model);
}
Y finalmente dentro de nuestra vista:
@model Helpers.Models.DetalleLibroViewModel
@{
    ViewBag.Title = "TextArea";
}
<h2>TextArea</h2>

@Html.TextArea("TxtArea")
@Html.TextArea("Descripcion", new { style = "background-color:yellow" })
@Html.TextArea("Desc", "José Arcadio Buendía y Úrsula Iguarán son un matrimonio de primos (...)")<br />
@Html.TextArea("Descrip", "En una pelea de gallos en la que resultó muerto el animal de Prudencio (...)", new { style = "font-weight: bold;" })
@Html.TextArea("Texto", "La gente del pueblo sospechaba que José Arcadio y Úrsula no habían (...)", 7, 40, new { style="color:blue;"})<br />

@Html.TextAreaFor(m => m.Libro.Descripcion)
@Html.TextAreaFor(m => m.Libro.Descripcion, new { style = "background-color:gray" })<br />
@Html.TextAreaFor(m => m.Libro.Descripcion, 4, 60, new { style = "color:red; font-style:italic;" })

El resultado será:

Recuerden que podrán descargar las fuentes desde aqui.
Seguir leyendo →

jueves, 18 de junio de 2015

Post 13. Helpers (III) DropDownList

En esta ocación revisaremos el uso de los helpers más complejos (lo que no significa que sea díficil de entender).

@Html.DropDownList / @Html.DropDownListFor 

Estos helpers no ayudan a generar las etiquetas <select> y <option>. A partir de una lista podemos crear el combo, a diferencia de otros lenguajes en los que debemos hacer un bucle y crearlos uno por uno.
Antes de empezar agregaremos las siguientes clases, las cuales nos servirán para los ejemplos futuros
using System;
using System.Collections.Generic;

namespace Helpers.Models
{
    public class LibroModel
    {
        public int id { get; set; }
        public string Nombre { get; set; }
        public AutorModel Autor { get; set; }
        public GeneroModel Genero { get; set; }
        public string Editorial { get; set; }
        public int Edicion { get; set; }
        public int Anio { get; set; }

        public LibroModel() { }
        public LibroModel(int id, string Nombre, int idAutor, int idGenero) {
            this.id = id;
            this.Nombre = Nombre;
            this.Autor = new AutorModel();
            this.Autor.id = idAutor;
            this.Genero = new GeneroModel();
            this.Genero.id = idGenero;
        }
    }
}
using System;
using System.Collections.Generic;

namespace Helpers.Models
{
    public class GeneroModel
    {
        public int id { get; set; }
        public string Nombre { get; set; }

        public GeneroModel() { }
        public GeneroModel(int id, string Nombre) {
            this.id = id;
            this.Nombre = Nombre;
        }
    }
}

Asi mismo agregaremos el siguiente ViewModel
using System;
using System.Collections.Generic;

namespace Helpers.Models
{
    public class DetalleLibroViewModel
    {
        public LibroModel Libro { get; set; }
        public List<GeneroModel> ListaGenero { get; set; }
    }
}

Dentro de nuestro controlador Home, accion DropDowList agregamos el siguiente código
public ActionResult DropDownList() {
    DetalleLibroViewModel model = new DetalleLibroViewModel();
    model.Libro = new LibroModel(2,"Paco Yunque",4 ,5);
    List<GeneroModel> listaGeneros = new List<GeneroModel>();
    listaGeneros.Add(new GeneroModel(1, "Novela"));
    listaGeneros.Add(new GeneroModel(2, "Cuento"));
    listaGeneros.Add(new GeneroModel(3, "Poema"));
    listaGeneros.Add(new GeneroModel(4, "Romance"));
    listaGeneros.Add(new GeneroModel(5, "Comedia"));
    listaGeneros.Add(new GeneroModel(6, "Drama"));
    model.ListaGenero = listaGeneros;
    return View(model);
}

Debemos agregar el siguiente codigo dentro de nuestra vista DropDownList:
@model Helpers.Models.DetalleLibroViewModel
@{
    ViewBag.Title = "DropDownList";
}
<h2>DropDownList</h2>

Lo normal en lenguajes como asp o php sería recorrer el array o lista con un bucle y generar nuestro combo, lo cual es válido tambien en razor, como veremos a continuación:
<select>
@foreach (Helpers.Models.GeneroModel genero in Model.ListaGenero) {
    <option value="@genero.id">@genero.Nombre</option>
}
</select>
<br /><br /><br /><br /><br /><br />

El resultado del código anterior sería

Como vemos el combo se creo sin problemas, revisemos el codigo HTML generado:
<select>
    <option value="1">Novela</option>
    <option value="2">Cuento</option>
    <option value="3">Poema</option>
    <option value="4">Romance</option>
    <option value="5">Comedia</option>
    <option value="6">Drama</option>
</select>

Ahora mostraremos el uso del helper, para ello listaremos sus principales constructores:
@Html.DropDownList(name)
@Html.DropDownList(name, optionLabel)
@Html.DropDownList(name, selectList)
@Html.DropDownList(name, selectList, htmlAttributes)
@Html.DropDownList(name, selectList, optionLabel)
@Html.DropDownList(name, selectList, optionLabel, htmlAttributes)

@Html.DropDownListFor(m => m.atributo, selectList)
@Html.DropDownListFor(m => m.atributo, selectList, htmlAttributes)
@Html.DropDownListFor(m => m.atributo, selectList, optionLabel)
@Html.DropDownListFor(m => m.atributo, selectList, optionLabel, htmlAttributes)

AtributoTipo DatoDescripción
nameStringValor que se le dará al atributo name. Si no se especifica el valor del atributo id tendrá el mismo valor name
optionLabelStringTexto por defecto para el combo, solo se indica el texto y su valor sera "" (vacio). Pj:  "- Seleccione -" 
selectListIEnumerableValores que se le asignarán a los tag <option></option>. Este objeto tiene distintas formas de uso las cuales se mostrarán en los ejemplos. En los casos  que no se use este objeto explicitamente, deberá existir un ViewData (o ViewBag) con el objeto SelectList.
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.
m => m.atributoObjectPredicado que indica el el valor de los atributos name y value (tambien el de id si no se especifica). La variable m (puede utilizarse cualquier nombre) representa a la clase especificada en el modelo. Según la propiedad del modelo que utilicemos el atributo name tendrá como valor e.
Antes de ejecutar el ejemplo debemos agregar el siguiente código a nuestra acción DropDownList (antes de return).
ViewData["Combo1"] = new SelectList(listaGeneros, "id", "Nombre");
ViewData["Combo2"] = new SelectList(listaGeneros, "id", "Nombre");

Ahora agregaremos los siguientes ejemplos de como usar este helper, como ya se habia mencionado son muchas formas en las que se puede utilizar este helper, trataremos de mostrar todas la formas posible y se coloca un comentario sobre cada uno de ellos para su mejor entendimiento
<br /><br />
@*Helper simple sus valores se cargan desde el controlador*@
@Html.DropDownList("Combo1")

@*Helper simple con etiqueta por defecto, sus valores se cargan desde el controlador*@
@Html.DropDownList("Combo2", "- Seleccione -")

@*Helper con valores desde una lista de objetos*@
@Html.DropDownList("Combo3", new SelectList(Model.ListaGenero, "id", "Nombre"))

@*Helper con valores desde una lista de objetos y atributos html*@
@Html.DropDownList("Combo4", new SelectList(Model.ListaGenero, "id", "Nombre"), new { style = "background-color:gray" })

@*Helper con valores desde un SelectListItem y etiqueta por defecto. Es posible colocar un valor por efecto con el atributo Selected*@
@Html.DropDownList("Combo5", new SelectList(new List<SelectListItem>{
        new SelectListItem { Selected = false, Text = "Novela", Value = "1"},
        new SelectListItem { Selected = false, Text = "Cuento", Value = "2"},
        new SelectListItem { Selected = false, Text = "Poema", Value = "3"},
        new SelectListItem { Selected = true, Text = "Romance", Value = "4"}
    }, "Value", "Text"), "Seleccione Género")

@*Helper con valores desde un array, con etiqueta por defecto y atributos html, nótese que se agregó un valor por defecto en el constructor del SelectList.*@
@Html.DropDownList("Combo6", new SelectList(new []{
        new {id="1", Nombre="Novela"},
        new {id="2", Nombre="Cuento"},
        new {id="3", Nombre="Poema"},
        new {id="4", Nombre="Romance"}
    }, "id", "Nombre", 5), "- Seleccione -", new { style = "color:red" })
<br /><br />

@*Helper con valores desde una lista de objetos*@
@Html.DropDownListFor(m => m.Libro.Genero.id, new SelectList(Model.ListaGenero, "id", "Nombre"))

@*Helper con valores desde una lista de objetos y atributos html*@
@Html.DropDownListFor(m => m.Libro.Genero.id, new SelectList(Model.ListaGenero, "id", "Nombre"), new { id="ComboGenero2", style="color:green;"})

@*Helper con valores desde una lista de objetos, nótese que aunque se colocó un valor por defecto con el atributo Selected, éste se ignora y prevalece el valor asignado al modelo*@
@Html.DropDownListFor(m => m.Libro.Genero.id, new SelectList(new List<SelectListItem>{
        new SelectListItem { Selected = false, Text = "Novela", Value = "1"},
        new SelectListItem { Selected = false, Text = "Cuento", Value = "2"},
        new SelectListItem { Selected = false, Text = "Poema", Value = "3"},
        new SelectListItem { Selected = true, Text = "Romance", Value = "4"},
        new SelectListItem { Selected = false, Text = "Comedia", Value = "5"}
    }, "Value", "Text"), "Selecciona")

@*Helper con valores desde una lista de objetos, nótese que aunque se colocó un valor por defecto en el constructor del SelectList y el atributo Selected, éstos se ignoran y prevalece el valor asignado al modelo*@
@Html.DropDownListFor(m => m.Libro.Genero.id, new SelectList(new List<SelectListItem>{
        new SelectListItem { Selected = false, Text = "Novela", Value = "1"},
        new SelectListItem { Selected = false, Text = "Cuento", Value = "2"},
        new SelectListItem { Selected = false, Text = "Poema", Value = "3"},
        new SelectListItem { Selected = true, Text = "Romance", Value = "4"},
        new SelectListItem { Selected = false, Text = "Comedia", Value = "5"}
    }, "Value", "Text", 3), " - Seleccionar - ", new { id = "ComboGenero4", style = "background-color:yellow;" })<br />

Al ejecutar nuestro código nuestra vista se mostraría de la siguiente manera:

Ahora revisemos el codigo Html generado por nuestros ejemplos
<br /><br />
<select id="Combo1" name="Combo1">

<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="Combo2" name="Combo2">

<option value="">- Seleccione -</option>
<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="Combo3" name="Combo3">

<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="Combo4" name="Combo4" style="background-color:gray">

<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="Combo5" name="Combo5">

<option value="">Seleccione G&#233;nero</option>
<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
</select>

<select id="Combo6" name="Combo6" style="color:red">

<option value="">- Seleccione -</option>
<option value="1">Novela</option>
<option selected="selected" value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
</select>
<br /><br />

<select id="Libro_Genero_id" name="Libro.Genero.id">

<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option selected="selected" value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="ComboGenero2" name="Libro.Genero.id" style="color:green;">

<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option selected="selected" value="5">Comedia</option>
<option value="6">Drama</option>
</select>

<select id="Libro_Genero_id" name="Libro.Genero.id">

<option value="">Selecciona</option>
<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option selected="selected" value="5">Comedia</option>
</select>

<select id="ComboGenero4" name="Libro.Genero.id" style="background-color:yellow;">

<option value=""> - Seleccionar - </option>
<option value="1">Novela</option>
<option value="2">Cuento</option>
<option value="3">Poema</option>
<option value="4">Romance</option>
<option selected="selected" value="5">Comedia</option>
</select>

Con esto espero que no tengan ningún problema en generar un combo con la ayuda del helper DropDownList, cualquier duda pueden hacerlo en los comentarios y gustosamente les contestaré. Recuerden que pueden descargar el código del post actual haciendo clic aqui.
Seguir leyendo →

lunes, 8 de junio de 2015

Post 12. Helpers (II) TextBox y Label

Antes de iniciar con estos ejemplos puedes descargar las fuentes finales del post anterior aquí para que puedas hacerlos por ti mismo.

Para los helpers que aprenderemos usar ahora, crearemos primero un modelo (clase) que nos servirá para mostrar su uso. La clase a utilizar será AutorModel utilizada anteriormente (puedes ver la clase en un post anterior).

@Html.TextBox / @Html.TextBoxFor

Los helpers que revisaremos a continuación tienen 2 formas diferentes, una se usa cuando quieres crear simplemente un objeto y otra cuando se desea crear un campo asociado a un elemento de un modelo. Primero revisaremos los constructores más usados:
@Html.TextBox(name)
@Html.TextBox(name,value)
@Html.TextBox(name,value, htmlAttributes)

@Html.TextBoxFor(m => m.atributo)
@Html.TextBoxFor(m => m.atributo, htmlAttributes)

AtributoTipo DatoDescripción
nameStringValor que se le dará al atributo name. Si no se especifica el valor del atributo id tendrá el mismo valor name
valueStringValor que se le dará al atributo value. Si no se especifica tendra el valor ""
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.
m => m.atributoObjectPredicado que indica el el valor de los atributos name y value (tambien el de id si no se especifica). La variable m (puede utilizarse cualquier nombre) representa a la clase especificada en el modelo. Según la propiedad del modelo que utilicemos el atributo name tendrá como valor el nombre de la propiedad y el atributo value tendrá como valor el valor del atributo.
Se pueden utilizar ambos para generar el mismo código html, pero utilizar la función TextBoxFor ofrece mayores beneficios, principalmente en la validación de formularios. Para ver la diferencia utilizaremos varios ejemplos de uso, para ellos agregaremos lo siguiente en el controlador home acción TextBox.

using Helpers.Models;
...
public ActionResult TextBox() {
      AutorModel autor = new AutorModel("Diego", "Arango", "Garcia");
      return View(autor);
}

Agregaremos la vista Index a la acción TextBox (utilizando el layout por defecto), y agregamos el siguiente código:
@model Helpers.Models.AutorModel
@{
    ViewBag.Title = "TextBox";
}
<h2>TextBox</h2>

@Html.TextBox("Nombre1")<br />
@Html.TextBox("Nombre2", "DIEGO")<br />
@Html.TextBox("Nombre3", "DIEGO ARANGO", new { style = "Color:red" })<br /><br />

@Html.TextBoxFor(m => m.Nombre)<br />
@Html.TextBoxFor(m => m.ApellidoP, new {id="ApellidoPaterno", style="font-weight:bold" })

El resultado al ejecutar nuestro código será:

Así mismo el código html generado será:
<input id="Nombre1" name="Nombre1" type="text" value="" /><br />
<input id="Nombre2" name="Nombre2" type="text" value="DIEGO" /><br />
<input id="Nombre3" name="Nombre3" style="Color:red" type="text" value="DIEGO ARANGO" /><br /><br />

<input id="Nombre" name="Nombre" type="text" value="Diego" /><br />
<input id="ApellidoPaterno" name="ApellidoP" style="font-weight:bold" type="text" value="Arango" />

@Html.Label / @Html.LabelFor

Estos helpers nos ayudan a crear las etiquetas <label>, al igual que el anterior posee dos formas de uso:
@Html.Label(expression)
@Html.Label(expression, labelText)

@Html.LabelFor(m => m.atributo)
@Html.LabelFor(m => m.atributo, labelText)

AtributoTipo DatoDescripción
expressionStringValor que se le dará al atributo for.
m => m.atributoObjectPredicado que indica el el valor del atributo for
labelTextStringValor que se le dará al contenido del tag. Si no se especifica tendrá el mismo valor que expression (Html.Label) o el nombre del atributo en caso no se especifique el valor de la propiedad Display (Html.LabelFor).
Para poder realizar el ejemplo de este helper debemos agregar el siguiente codigo a nuestro modelo:
using System.ComponentModel.DataAnnotations;
...
[Display(Name = "Nombre del Autor: ")]
public string Nombre { get; set; }
[Display(Name = "Apellido Paterno del Autor")]
public string ApellidoP { get; set; }


Dentro de nuestro controlador Home, colocaremos el siguiente código en la accion Label:
public ActionResult Label() {
      AutorModel autor = new AutorModel("Leo", "Arango", "Rojas");
      return View(autor);
}
Dentro de nuestra vista agregamos lo siguiente:
@model Helpers.Models.AutorModel
@{
    ViewBag.Title = "Label";
}
<h2>Label</h2>
@Html.Label("Nombre")<br />
@Html.Label("Nombre", "Nombre Completo")<br /><br />
@Html.LabelFor(m => m.Nombre)<br />
@Html.LabelFor(m => m.ApellidoP)<br />
@Html.LabelFor(m => m.ApellidoP, "Ap. Paterno")<br />
@Html.LabelFor(m => m.ApellidoM)<br />


Así mismo el codigo Html generado es:
<label for="Nombre">Nombre del Autor: </label><br />
<label for="Nombre">Nombre Completo</label><br /><br />
<label for="Nombre">Nombre del Autor: </label><br />
<label for="ApellidoP">Apellido Paterno del Autor</label><br />
<label for="ApellidoP">Ap. Paterno</label><br />
<label for="ApellidoM">ApellidoM</label><br />

Podrán descargar el código del presente proyecto desde aquí
Seguir leyendo →

viernes, 5 de junio de 2015

Post 11. Helpers (I) ActionLink y BeginForm

En este post mostraremos como utilizar los Helpers básicos y más usados en Razor, como ya habíamos comentado anteriormente los helpers son funciones que nos permiten generar codigo HTML, principalmente elementos de formularios (aunque podamos generar prácticamente cualquier tipo de código html). Los helpers que revisaremos a continuación poseen numerosos constructores pero solo mostraremos los más utilizados (en mi experiencia personal).

Antes de empezar, puedes descargar el siguiente proyecto para que puedas hacer seguir los pasos por ti mismo.

@Html.ActionLink

Esta función nos permite generar enlaces, es decir elementos con la etiqueta <a>.
@Html.ActionLink(linkText, actionName)
@Html.ActionLink(linkText, actionName, routeValues)
@Html.ActionLink(linkText, actionName, controllerName)
@Html.ActionLink(linkText, actionName, routeValues, htmlAttributes)
@Html.ActionLink(linkText, actionName, controllerName, htmlAttributes)
@Html.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes)

Atributo Tipo Dato Descripción
linkTextStringTexto a Mostrar en el Enlace.
actionNameStringNombre de la Acción a la que se desea redireccionar.
routeValuesObjectParametros que se desean agregar a la URL (GET).
controllerNameStringNombre del controlador al que se desea redireccionar. En caso de redireccionar a una acción del mismo controllador no es obligatorio especificarlo.
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.

Para hacer mas dinámico nuestro proyecto agregaremos los siguientes ActionLink a la vista index, en los cuales veremos los distintos usos que se les da a este helper:

@Html.ActionLink("BeginForm", "BeginForm")<br />
@Html.ActionLink("Label", "Label", new { mensaje="Hola"})<br />
@Html.ActionLink("TextBox", "TextBox", "Home")<br />
@Html.ActionLink("Hidden", "Hidden", new { indice=1 }, new { style="font-weight:bold;" })<br />
@Html.ActionLink("CheckBox", "CheckBox","Home", new { style="color:green;" })<br />
@Html.ActionLink("DropDownList", "DropDownList", "Home", new { indice=1 }, new { style="font-style:italic;" })<br />
@Html.ActionLink("RadioButton", "RadioButton", "Home", new{ @class="yellowCode" })<br/>
@Html.ActionLink("TextArea", "TextArea")<br />
@Html.ActionLink("ListBox", "ListBox")<br />
@Html.ActionLink("Ejemplo 1""Ejemplo1")<br />
@Html.ActionLink("Ejemplo 2""Ejemplo2")<br />
@Html.ActionLink("Ejemplo 3""Ejemplo3")<br />


Nótese que en el ejemplo anterior se uso la palabra class con un @, ésto se hace para razor pueda diferenciar la palabra reserva class con el atributo html class.
Debemos también agregar las siguientes acciones a nuestro controlador Home, así mismo debemos crear una vista (en blanco) para cada uno de ellos:

public ActionResult BeginForm() { return View(); }
public ActionResult Label() { return View(); }
public ActionResult TextBox() { return View(); }
public ActionResult Hidden() { return View(); }
public ActionResult CheckBox() { return View(); }
public ActionResult DropDownList() { return View(); }
public ActionResult RadioButton() { return View(); }
public ActionResult TextArea() { return View(); }
public ActionResult ListBox() { return View(); }
public ActionResult Ejemplo1() { return View(); }
public ActionResult Ejemplo2() { return View(); }
public ActionResult Ejemplo3() { return View(); }




Al ejecutar nuestro Código debemos tener lo siguiente:


@Html.BeginForm 

Este Helper es el principal, ya que todos los otros helpers tendrán que utilizarce "dentro" de este Helper, al igual como los campos del formulario están dentro de las etiquetas <form> y </form>.
@Html.BeginForm()
@Html.BeginForm(routeValues)
@Html.BeginForm(actionName, controllerName)
@Html.BeginForm(actionName, controllerName, method)
@Html.BeginForm(actionName, controllerName, routeValues)
@Html.BeginForm(actionName, controllerName, method, htmlAttributes)
@Html.BeginForm(actionName, controllerName, routeValues, method)
@Html.BeginForm(actionName, controllerName, routeValues, method, htmlAttributes)

AtributoTipo DatoDescripción
routeValuesObjectParametros que se desean agregar a la URL (GET).
actionNameStringNombre de la Acción a la que se desea redireccionar.
controllerNameStringNombre del controlador al que se desea redireccionar. Si no se especifica una Acción y un Controlador el atributo acción tendrá como valor "/", lo que significa que se enviará a la misma página.
methodFormMethodClase que nos indica el tipo de methodo a usar en el formulario: Get o Post, SI no se escifica un methodo el atributo method tendrá como valor "post".
htmlAttributesObjectAtributos HTML que se deseen agregar a la etiqueta, tales como class, id, style, etc.

Existen dos formas de utilizar este helper, ambas generan el mismo código html.
@using (Html.BeginForm()) {
   @* Campos del Formulario *@
}

@{Html.BeginForm();}
   @* Campos del Formulario *@
@{Html.EndForm();}

 En ambos casos el resultado será:
<form action="/" method="post"></form>

A continuación mostraremos mas ejemplos de los diferentes usos de BeginForm.
@using(Html.BeginForm()) {}
@using(Html.BeginForm(new { id = 5, genero = "Comedia"})) {}
@using(Html.BeginForm("BeginForm", "Home")) {}
@using(Html.BeginForm("BeginForm", "Home", FormMethod.Post)) {}
@using(Html.BeginForm("BeginForm", "Home", new { id = 12 })) {}
@using(Html.BeginForm("BeginForm", "Home", FormMethod.Get, new { id="FormPrincipal"})){}
@using(Html.BeginForm("BeginForm", "Home", new { idAutor = 4 }, FormMethod.Get)) {}
@using(Html.BeginForm("BeginForm", "Home", new { idLibro = 78 }, FormMethod.Post, new { id = "FormBusqueda" })) { }

Y el resultado para estos ejemplos es:
<form action="/" method="post"></form>
<form action="/Home/BeginForm/5?genero=Comedia" method="post"></form>
<form action="/Home/BeginForm" method="post"></form>
<form action="/Home/BeginForm" method="post"></form>
<form action="/Home/BeginForm/12" method="post"></form>
<form action="/Home/BeginForm" id="FormPrincipal" method="get"></form>
<form action="/Home/BeginForm?idAutor=4" method="get"></form>
<form action="/Home/BeginForm?idLibro=78" id="FormBusqueda" method="post"></form>

Podrán descargar las fuentes utilizadas en este proyecto haciendo clic aqui.
Seguir leyendo →

miércoles, 6 de mayo de 2015

Post 10. Motor de vistas Razor (II)

En el post anterior, mostramos las bases para entender la sintaxis de razor, viendo principalmente ejemplos de sus componentes más importantes, en esta ocasión nos enfocaremos mas a las reglas de su sintaxis.

Inicio y Fin: @
A diferencia de aspx en el cual las etiquetas <% y %> delimitan el inicio y fin del código .net dentro de nuestra vista, en razor disponemos de la etiqueta @ la cual nos indica el inicio de nuestro código mas no disponemos de etiqueta de cierre. Pero esta etiqueta tiene varios formas de acuerdo al uso que queramos darle. Algunos de ellos ya los hemos visto, pero vamos a repasarlos.

@[Palabra Reservada]

Cuando usamos la etiqueta @ junto a una palabra reservada indicamos a razor que debemos usar un recurso no administrado (una conexión sql, una libreria de funciones, una clase, etc.). Notese que tampoco se usa el simbolo ";" para indicar el fin de la línea.

@using Microsoft.Class
@model Models.MiModelo

@[Variable]

Cuando usamos la etiqueta @ junto a una variable, indicamos que debemos mostrar el valor de la variable en nuestra vista.

@ViewData.["Mensaje"]
@Model.Nombre

@[Función]

Cuando usamos la etiqueta @ junto a una función, indicamos que debemos mostrar el valor devuelto por la función en nuestra vista.

@Html.TextBoxFor(m => m.Nombre)
@Model.Nombre.Substring(0,5)

@* Texto*@

Ya hemos visto este uso en el post anterior y es incluir comentarios en nuestra vista. Nótese que estos comentarios no generan código html (<!--Texto--> ) y solo son visibles desde el código fuente.
@*Esto es un comentario en razor*@

@[Estructura de Control]

Razor tambien tiene su propia sintaxis para las estructuras de control, muy parecidas a las usadas en .net, solo debemos agregar un @al inicio del control y el uso de llaves es obligatorio, así mismo el código dentro de las llaves debe tener la sintaxis normal de .net (usar ";", las variables y funciones no llevan @, etc. )

@if(Model.Nombre == "") { a++; }

@{Codigo .net}

Cuando usamos la etiqueta @ junto a llaves (inicio y cierre) indicamos a razor que debemos ejecutar código .net. En este caso se respetan toda la sintaxis de .net (igual que las estructuras de control).

@{int a = 0;}

<text></text>

En algunos casos deseamos incluir codigo razor dentro de nuestras llaves. En ese caso usaremos las etiquetas <text></text> para indicar a razor que ese bloque sera considerado texto html.
<select name="Ciudad">
@foreach (stringcadena in Model.Ubigeo) {
    <text><option value="@cadena">@cadena</option></text>
}
</select>

@:

Tiene la misma funcionalidad que las etiquetas <text></text>
<select name="Ciudad">
@foreach (stringcadena in Model.Ubigeo) {
    @:<option value="@cadena">@cadena</option>
}
</select>

@(valor)

En ciertos casos debemos tener cuidado para que razor interprete correctamente lo que queremos mostrar, por ejemplo el siguiente código
@{int a = 0;}
El valor de a es @a + 1

Se mostrará:
El valor de a es 0 + 1

Cuando lo que hubiéramos deseado es que se muestre un 1 y no un 0 + 1, esto sucede por la regla @[variable] en la que muestra el valor de @a puesto que + 1 es solo una cadena de html, si necesitamos que se muestre el mensaje El valor de a es 1, lo que debemos hacer es:
@{int a = 0;}
El valor de a es @(a + 1)

En este caso lo que le decimos a razor es que debemos mostrar el valor de a + 1 y no solo el valor de a.

@@

En el caso de que debamos mostrar un @ en nuestra vista, sólo bastará con agregar un @@, en nuestra vista solo se mostrará uno.

arangodj@@gmail.com

Estas son las reglas básicas para poder programar en razor, si hubiera alguna otra consideración se agregará en el post, deben tenerlas siempre presente para entender y probar los futuros ejemplos.



Seguir leyendo →

jueves, 29 de enero de 2015

Post 9. Motor de vistas Razor (I)

En esta ocasión hablaremos acerca de Razor, motor que es utilizado en MVC (disponible a partir de MVC3) para poder renderizar nuestras vistas, este motor es como un lenguaje que nos permite "crear" código HTML, con la ayuda de este motor podremos llenar grillas, combos, menús, así mismo podemos crear controles HTML (formluarios, inputs, labels, etc.).

Cuando digo que "es como un lenguaje" me refiero a que Razor no es un lenguaje de programación nuevo que debas aprender, mas bien que es un conjunto de reglas o sintaxis con las que podremos usar los lenguajes de programación que brinda Visual Studio (C# o VB).

Si ya has programado antes en asp o php, pues Razor maneja una forma de trabajo muy parecida en la que combinas el lenguaje de programación con el lenguaje HTML (incluso JS o CSS si es necesario) con el cual podremos generar código de manera mas rápida y reduciendo la cantidad de caracteres.

A diferencia de aspx, en la que podemos "jalar" controles desde nuestra caja de herramientas y automáticamente se nos genera todo el código necesario, lo cual es ventaja y desventaja al mismo tiempo: ventaja porque creamos un control en segundos y desventaja porque el no todo el código generado es necesario o para poder cambiar algún simple atributo se debe hacer desde el código en servidor, en Razor, en cambio, debemos digitar todo el código (y sin opción a vista previa :/ ), y claro que intellisense nos ayudara a que esto no sea un calvario, pero podremos manipular más a fondo el código generado. Esta es su mayor ventaja pero como no todo puede ser perfecto, razor nos "obliga" a conocer mas a fondo el lenguaje HTML, JS y CSS, lo cual en el fondo tampoco es tan malo, pero nos hará "sufrir" un poquito más al inicio.

La sintaxis que utilizamos para poder mostrar los ViewBag/ViewData y los modelos dentro de nuestras vistas fueron nuestros primero pasos en Razor. En este post veremos el uso de las principales propiedades de una pagina Razor:

@ViewData / @ViewBag

Ya sabemos como utilizar estas propiedades:
@ViewBag.Message
@ViewData.["Message"]

@Model

Utilizamos esta propiedad para especificar el modelo a utilizar en nuestra vista, no es obligatorio colocarlo, pero usarlo o no usarlo nos puede ayudar de diversas maneras. Una de las ventajas de especificar la clase que se utilizará en la vista es que intellisense nos ayuda a generar la vista con su autocompletar. Por otra parte si no se coloca @model la vista puede ser reutilizada por distintos controladores, siempre y cuando posean el nombre de  sus atributos iguales, esto en la práctica no es muy usual, por lo cual se recomienda siempre especificar la clase modelo para cada vista.

Su sintaxis es de la siguiente manera:

@model Razor.Models.AutorModel

@using

Su funcionalidad es la misma que using en cualquier clase, usaremos @using cuando deseemos utilizar alguna clase o función de alguna dll, librería de clases o que se encuentre en un distinto namespace.

Su sintaxis es de la siguiente manera:

@using Razor.Helpers

@Html - Helpers

Este control mas conocido como Helpers Html, es el más usado en razor (y se podría decir el más importante), con él podremos crear cualquier objeto html, label, inputs, forms, textarea, etc.

A continuación les dejare ejemplos de los casos mas usados, en un siguiente post mostraremos un ejemplo de cada uno de los tipos, por ahora tendremos solo un avance:

@Html.TextBoxFor(m => m.Nombre)

@* Comentarios *@

Pues como se ve arriba para agregar comentarios en razor solo se debe colocar el texto entre "@*" y "*@". Nótese que estos comentarios son solo comentarios en la página razor y no generar ningún código Html.

@*Esto es un comentario en razor*@

A continuación mostraremos los ejemplos usados en un nuevo proyecto, el cual se creó con una plantilla "Internet Application" (por cuestiones de que ya tiene estilos CSS y se ve más "bonito")

/Controllers/HomeController.cs

using System.Web.Mvc;
using Razor.Models;

namespace Razor.Controllers
{
   public class HomeController : Controller
   {
      public ActionResult Index()
      {
         AutorModel model = new AutorModel("Diego","Arango","Garcia");
         ViewBag.Message = "Aprender Razor en ASP.NET MVC!";
         return View(model);
      }

      public ActionResult About()
      {
         return View();
      }
   }
}

/Models/AutorModel.cs

using System;
using System.Collections.Generic;

namespace Razor.Models
{
   public class AutorModel
   {
      public string Nombre { get; set; }
      public string ApellidoP { get; set; }
      public string ApellidoM { get; set; }
      public DateTime FechaActual { get; set; }

      public AutorModel() { }
      public AutorModel(string Nombre, string ApellidoP, string ApellidoM) {
         this.Nombre = Nombre;
         this.ApellidoP = ApellidoP;
         this.ApellidoM = ApellidoM;
         this.FechaActual = DateTime.Now;
      }
   }
}

/Views/Home/Index.cshtml

@model Razor.Models.AutorModel
@using Razor.Helpers

<h2>@ViewBag.Message</h2>
<p>
   @*Esto es un comentario en razor*@
   Este post fue creado por @Model.Nombre @Model.ApellidoP<br />
   el @Formateador.FormatoFecha(Model.FechaActual)
   <br /><br />
   Actualizar datos del Autor:<br />
   @Html.TextBoxFor(m => m.Nombre)<br />
   @Html.TextBoxFor(m => m.ApellidoP)<br />
   @Html.TextBoxFor(m => m.ApellidoM)<br />
</p>

Al ejecutar veremos el siguiente resultado:



Con estos ejemplos iniciales de como usar razor nos despedimos hasta el siguiente post, donde veremos la forma de conbinar nuestro codigo html con razor y C# para poder generar codigo HTML dinámicamente, hasta la próxima.

Las fuentes para este ejemplo puden descargarlas aqui.

Nota:
Se eliminaron del proyecto (ya que no eran necesarios para el ejemplo) los siguientes archivos: /Controllers/AccountController.cs.
/Models/AccountModels.cs.
/Views/Shared/_LogOnPartial.cshtml
/Views/Account/ (carpeta).
Ademas se modificó el archivo "/Views/Shared/_Layout.cshtml" cambiando "<div id="logindisplay"> @Html.Partial("_LogOnPartial") </div>" por "<div id="logindisplay"> &nbsp; </div>".

Seguir leyendo →

lunes, 19 de enero de 2015

Post 8. Intercambio de Datos en MVC - Valores desde controlador hacia la vista (II)

En el post anterior vimos como enviar datos desde el controlador hacia la vista utilizando ViewData y ViewBag, en esta ocación mostraremos otra forma de hacerlo:

Enviar datos a la vista a través de @Model


Esta nueva forma es la forma mas práctica y eficiente de enviar datos hacia el controlador y ofrece muchas más ventajas que ViewData y ViewBag. Pera esto debemos definir una Clase la cual servirá como modelo para nuestra vista.

Definimos una clase llamada Smartphone (para cuestiones practicas lo crearemos dentro del mismo controlador, mas adelante veremos el mejor lugar para ubicarlo):
public class SmartPhone{
   public string Marca {getset;}
   public string Modelo {getset;}
   public int Stock {getset;}
   public decimal Precio {getset;}
}
Dentro de nuestro controlador crearemos una nueva instancia de la clase SmartPhone y le agregaremos los datos traídos desde la url, luego lo enviaremos hacia nuestra vista con el comando View():
public class CatalogoController : Controller
{
   public ActionResult Smartphones(String marca, String modelo)
   {
      SmartPhone phone = new SmartPhone();
      phone.Marca = marca;
      phone.Modelo = modelo;
      return View(phone);
   }
}
Ahora para poder mostrar los datos desde nuestra vista debemos el
Dentro de la vista agregamos lo siguiente:

@model IntercambioDatos.Controllers.SmartPhone
<!DOCTYPE html>
<html>
<head>
    <title>Smartphones</title>
</head>
<body>
Prueba usando un Model<br />
Marca: @Model.Marca<br />
Modelo: @Model.Modelo<br />
Precio: @Model.Precio<br />
Stock: @Model.Stock
</body>
</html>

Ahora ejecutamos y mostramos.


Podemos ver que los datos de nuestro modelo se pintaron en nuestra vista y aparentemente de la misma manera que un ViewBag. Las (grandes) ventajas las veremos cuando enviemos datos de la vista hacia el controlador.

Nota: a pesar qde que no colocamos el valor para los atributos Precio y Stock, se mostraron 0, porque ese es el valor por defecto para esos  tipos de datos (int y decimal).

Recuerden que las fuentes de este post podrán ser descargadas aqui.
Nos vemos en el siguiente post
Seguir leyendo →

domingo, 18 de enero de 2015

Post 7. Intercambio de Datos en MVC - Valores desde controlador hacia la vista (I)

En el post anterior mostramos como obtener datos desde la url hacia el controlador, en esta ocasión mostraremos como enviar datos desde el controlador hacia la vista.

Esto nos sirve por ejemplo, cuando desde el controlador accedemos a base de datos y obtenemos una listado de clientes y obviamente deseamos mostrar estos datos en una grilla de nuestra vista.

Pues para enviar datos desde el controlador hacia nuestra vista existe dos maneras:

Enviar datos a la vista a través de ViewData y ViewBag

A pesar de que son dos formas de enviar datos en realidad son lo mismo y lo mostraremos mas adelante.

Utilizando el ejemplo del post anterior mostraremos los valores de las variables marca y modelo dentro de nuestra vista, en primer lugar utilizaremos ViewData y lo hacemos de la siguiente manera:
public class CatalogoController : Controller {
     public ActionResult Smartphones(String marca, String modelo)
    {
       ViewData["Marca"] = marca;
       ViewData["Modelo"] = modelo;
        return View();
    }
 }

Una vez colocados los valores a nuestros ViewData podemos acceder a su valor desde la vista de la siguiente manera:
<!DOCTYPE html>
<html>
<head>
    <title>
Smartphones</title>
</head>
<body>
Marca: @ViewData["Marca"]<br />
Modelo: @ViewData["Modelo"]
</body>
</html>


Ahora mostraremos los mismos datos pero utilizando ViewBag:
public class CatalogoController : Controller {
     public ActionResult Smartphones(String marca, String modelo)
    {
       ViewBag.Marca = marca;
       ViewBag.Modelo = modelo;
        return View();
    }
 }

<!DOCTYPE html>
<html>
<head>
    <title>
Smartphones</title>
</head>
<body>
Prueba usando ViewBag:<br />
Marca: @ViewBag.Marca<br />
Modelo: @ViewBag.Modelo
</body>
</html>


Vemos que el resultado es el mismo que si usáramos un ViewData. Ahora modificaremos la vista para mostrar los datos utilizando ViewData pero no modificaremos el ViewBag del controlador, ejecutemos y veamos que es lo que pasa:
public class CatalogoController : Controller {
    public ActionResult Smartphones(String marca, String modelo)
    {
       ViewData["Marca"] = marca;
       ViewData["Modelo"] = modelo;
        return View();
    }
 }

<!DOCTYPE html>
<html>
<head>
    <title>
Smartphones</title>
</head>
<body>
Prueba usando ViewData en el controlador y ViewBag en la vista:<br />
Marca: @ViewBag.Marca<br />
Modelo: @ViewBag.Modelo
</body>
</html>


Podemos ver que aunque utilicemos ViewBag en el controlador y ViewData en la vista, nuestra variables se muestran sin problema (usarlo en viceversa también funciona), por ello podemos decir que ambas opciones son una sola (no son realmente lo mismo pero podemos usar cualquiera de las dos y funcionarán igual).

En el siguiente post veremos otra forma de enviar los datos del controlador hacia la vista usando modelos.

Recuerden que pueden descargar las fuentes de este post aquí
Seguir leyendo →

martes, 13 de enero de 2015

Post 6. Intercambio de Datos en MVC - Valores en URL

En este post revisaremos los distintos modos en que podemos intercambiar datos en MVC, ya sea valores de la url, valores del controlador y valores de la vista.

Intercambio de Valores de URL
Como vimos en el post anterior, podemos definir distintas reglas para manejar nuestras url, ya habíamos dicho que la regla debería contener al menos el valor para el controlador y la vista (ya sea en la misma ruta o con valores por defecto), pero adicionalmente nuestra ruta contenía algunas variables que seguramente necesitaríamos para poder mostrar determinada información.

Recordemos uno de los ejemplos dados:
   http://webcelulares.com/Catalogo/Smartphones/LG/DG952
En esta url corresponde a la regla "{controller}/{action}/{marca}/{modelo}", en la cual nuestro controlador es Catalogo y nuestra vista es Smartphones pero las variables marca y modelo seguramente son datos necesarios para que la web muestre los detalles de ese smartphone.

Entonces ¿cómo puedo obtener los valores de esas variables?, pues lo hacemos desde nuestro controlador. para ello definimos las variables como parámetros en la acción del controlador:
(Crearemos un proyecto MVC3 vacío)

Agregamos la ruta a nuestro global.asax, el controlador Catalogo y la acción Smartphones:


Dentro del controlador Catalogo debemos tener lo siguiente:

Aquí debemos tener en cuenta lo siguiente:
public class CatalagoController : Controller {
    public ActionResult Smartphones(String marca, String modelo)
    {
        return View();
    }
}
Ahora agregamos un punto de interrupción (F9) en la linea return View(); y ejecutamos.
Al ejecutar mostrará un error pues la url que se muestra no cumple con nuestra regla, debemos ingresar a la ruta: localhost:xxx/Catalogo/Smartphones/LG/D625:


  • Los nombres de los parámetros deben ser iguales a los nombres definidos en nuestra regla. MVC no diferencia entre mayúsculas y minúsculas. Cambiamos en nombre del parámetro marca a marcaTelefono y ya no es reconocido, también cambiamos el nombre del parametro modelo a Modelo, pero éste aun es reconocido.

  • MVC hará un parseo del valor en la url al tipo de dato definido en la acción, si el tipo de dato no corresponde ocurrirá un error.
  • Podemos definir más variables como parámetro a en la url sin necesidad de registrarlos en el global.asax, estos deberán ser enviado como un querystring en la url.

Ingresamos la url: http://localhost:8010/Catalogo/Smartphones/LG/D625?color=black&version=4.2.2


  • Podemos definir valores por defecto para cada una de las variables, en caso sea necesario.
Ingresamos la url: http://localhost:8010/Catalogo/Smartphones/LG/D625, podemos observar que al no enviarle valores a los parámetros, estos no tienen valor null, sino el valor por defecto.


De esta manera es que podemos capturar los datos de la url para ser utilizados en nuestra aplicación.
Pueden descargar este proyecto haciendo clic aqui
Hasta el siguiente post!!.
Seguir leyendo →

Contactos

Post Populares

123.Net

123.Net

Vistas a la página totales

Con tecnología de Blogger.