Anda di halaman 1dari 9

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/240611007

ASP.NET MVC y jQuery, más poder, más control, ¿más esfuerzo?

Article · January 2011

CITATIONS READS

0 6,966

2 authors:

Alejandro Tamayo Miguel Katrib


University of Havana University of Havana
15 PUBLICATIONS   6 CITATIONS    44 PUBLICATIONS   48 CITATIONS   

SEE PROFILE SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Academic Libraries in Videogames View project

Rendering View project

All content following this page was uploaded by Miguel Katrib on 08 September 2015.

The user has requested enhancement of the downloaded file.


ASP.NET MVC y jQuery
Más poder, más control, ¿más esfuerzo?

En los últimos años, la Web ha evolucionado considerablemente para crear páginas más dinámicas, más
colaborativas y más dedicadas al usuario. En este artículo se verá cómo combinar ASP.NET MVC y jQuery
para producir una interfaz de usuario más responsiva y de mayor calidad.

La llamada Web 2.0 se caracteriza por ser más diná- ble para un determinado tipo de usuarios, sobre
mica, permitiendo una mayor interacción con los todo si metemos en escena a las luchas comer-
usuarios. JavaScript ha jugado un papel protagó- ciales y otros intereses que no son propiamen-
nico para lograr aplicaciones con estas caracterís- te tecnológicos.
ticas y a la vez seguir cumpliendo con los están- Esto ha llevado a que muchos desarrolladores
dares web. Muchos lectores tendrán conciencia del decidan "machacarse" y volver a lo básico: Java-
grado de complejidad que tiene desarrollar este Script. JavaScript es pequeño y limitado en com-
tipo de aplicaciones. Las dificultades se deben fun- paración con los lenguajes de propósito general,
damentalmente a la arquitectura cliente-servidor y pero es suficiente para el desarrollo de aplicacio-
desconectada del protocolo HTTP, la cual obliga a nes web interesantes gracias a la disponibilidad de
una división en el desarrollo: por un lado, el códi- un conjunto de bibliotecas de funciones (tal es el
go que se ejecuta en el servidor, y por otro, aquel caso de jQuery [2]) que incluyen mucho código de
que se ejecuta en el navegador una vez que se car- fácil utilización para el desarrollo de interfaces de
ga la página web. Ambas partes tienen que estar usuario de calidad y que ejecutan en cualquier nave-
en sintonía para producir una aplicación que con- gador web o sistema operativo.
tenga una interfaz de usuario funcional y agrada- Pero para utilizar jQuery (o cualquier otra biblio-
ble (al estilo de las aplicaciones de escritorio) jun- teca de propósito similar, como Prototype) más allá
to a un comportamiento (usualmente guiado por de la creación de animaciones (DHTML) o modifica-
el servidor) que esconda esta complejidad del pro- ción de los elementos de la página web con el objeti-
tocolo HTTP. vo de crear una presentación más estilizada, por ejem-
Por esta razón han surgido las RIA1 [1] tales plo, para crear controles que extraigan datos del ser-
como Adobe Flex y Microsoft Silverlight. El pro- vidor o que dependan de cierto comportamiento defi-
blema con las RIA radica en que cada una exige nido en esa parte, juega un papel fundamental la pla-
instalar componentes adicionales en el navega- taforma que esté del lado del servidor, ya que en depen-
dor para poder ejecutar la aplicación (por ejem- dencia de ésta, la integración con jQuery será más
plo, Flash o Silverlight). Si bien internamente simple o más enrevesada.
esto puede ser aceptable para una organización, Como posiblemente ya el lector habrá escu-
en el vasto mundo de Internet (en ocasiones chado, ASP.NET MVC [3] implica un cambio radi-
intolerante) esto puede resultar molesto o invia- cal para los desarrolladores web que utilizan tec-
Alejandro Tamayo y Miguel Katrib
Instructor, desarrollador del Grupo
1
Del inglés Rich Internet Applications.
WEBOO, Universidad de La Habana;
Doctor y Profesor Titular, líder del Grupo
WEBOO, Universidad de La Habana
nología .NET debido a que su diseño Note que los controles predetermi- eventos de .NET, de manera similar a
se basa en una arquitectura limpia, fun- nados de HTML no satisfacen estos las aplicaciones Windows), puede con-
damentada en la inclusión de patrones requerimientos. Por ejemplo, una primera vertirse en un problema de gran com-
de diseño para agilizar el desarrollo y idea podría ser utilizar un menú desple- plejidad cuando el desarrollador desea
en la aplicación de pruebas unitarias gable (Dropdown List), pero este tipo de personalizar ciertos aspectos, como la
para garantizar la calidad del software. control requiere que se "rellenen" las inclusión de Widgets jQuery o la ejecu-
En este artículo se verá cómo jQuery y opciones de selección a priori, por lo que ción parcial del ciclo de vida de ASP.NET
ASP.NET MVC pueden combinarse de sería inmanejable para muchos elemen- para producir solo un pedazo de la pági-
manera natural para desarrollar aplica- tos (tanto por el tráfico como por el gas- na. Piense en una página .aspx que
ciones de alta calidad. Note que esto no to de memoria en el navegador web). represente un tablero de mando (Dash-
niega que jQuery se pueda utilizar con La solución que vamos a ilustrar board) donde cada elemento se repre-
ASP.NET clásico; sino que muchos de consiste en utilizar una caja de texto senta como un control de usuario
los problemas que los desarrolladores que autocomplete los nombres de (ASP.NET User Control). Procesar dicha
pueden encontrarse con ASP.NET clá- manera eficiente a partir de una lista página podría suponer un costo opera-
sico (tales como la creación de mane-
jadores HTTP para servir datos y la con-
versión manual a JSON2) se simplifican
con la forma de desarrollo que intro- ASP.NET MVC implica un cambio radical para los desa-
duce ASP.NET MVC. rrolladores web que utilizan tecnología .NET debido a que
su diseño se basa en una arquitectura limpia, fundamen-
Desarrollando un control tada en la inclusión de patrones de diseño para agilizar el
"Selección de persona" desarrollo y en la aplicación de pruebas unitarias para
garantizar la calidad del software. jQuery y ASP.NET MVC
Para mostrar la integración entre jQuery
y ASP.NET MVC se escogió como ejem- pueden combinarse de manera natural para desarrollar
plo el desarrollo de un control3 para "selec- aplicaciones de alta calidad
cionar una persona". Este control pudie-
ra implementarse como una caja de tex-
to común y corriente que reciba una cade-
na de texto, pero en tal caso tendríamos de personas, y que el texto que se escri- cional, por lo que sería útil poder divi-
el problema de la libertad del formato: el ba en la caja de texto se valide contra dir la misma y actualizar cada control
nombre "Angelina Jolie" es, desde el pun- dicha lista. de usuario de manera independiente.
to de vista computacional, diferente a "A. Usted pudiera pensar que el problema
Jolie" o "Jolie, Angelina"; pero semánti- se resuelve incluyendo cada control de
camente es la misma persona. Por tanto, Separando las responsabilidades usuario en un Update Panel (ASP.NET
se requiere el desarrollo de un control que AJAX Extensions), pero lamentablemen-
cumpla los siguientes requisitos: En ASP.NET clásico, una página web te, producto de la génesis de ASP.NET,
dinámica (.aspx) puede verse como un aunque viaje entre el servidor y el clien-
• Restrinja el formato para que se iden- gran proceso monolítico que construye te solamente el código HTML de actua-
tifique a una misma persona de mane- lo que será la página HTML que visua- lización de dicha región, se sigue eje-
ra única. liza el navegador web, pero mante- cutando el ciclo de vida completo de la
• Ayude al usuario a realizar la selección niendo el estado de ejecución de la lógi- página ASP.NET; es por ello que se dice
por si éste no recuerda el nombre com- ca de la aplicación en el servidor. Esto, que es un proceso monolítico.
pleto. si bien es una ventaja para aquellos pro- Una de las características más
• Minimice el tráfico cliente-servidor, pero gramadores de .NET que desean desa- importantes que brinda ASP.NET MVC
que permita la búsqueda sobre una rrollar aplicaciones web sin un conoci- es la Separación de Responsabilidades
base de datos de personal que puede miento profundo de HTTP y HTML (se o SoC (Separation of Concerns)4. Preci-
ser voluminosa. programa en términos de controles y samente con la aplicación del patrón

2
JavaScript Object Notation.
3
Hemos usado el término control siguiendo el símil con los controles de Windows, aunque en la Web se usa el término Widget , o en el caso de jQuery
dotNetManía

también el término Plug-in.


4
Una traducción al español del término Separation of Concerns sería Separación de Responsabilidades, pero es importante que el lector conozca y
maneje las siglas SoC, porque son las que se va a encontrar en la documentación que existe en la web.

13
MVC, esta clásica página monolítica de
ASP.NET se convierte en varios peda- public class TaskModel
zos conceptualmente diferentes que {
pueden componerse en un resultado public int Id { get; set; }
final según fuese necesario. Otra carac-
terística muy interesante en ASP.NET [Required(ErrorMessage = "Descripción requerida")]
public string Description { get; set; }
MVC es el control total que tiene el
desarrollador sobre el código HTML [Required(ErrorMessage = "Debe seleccionar una persona válida")]
generado; ya no hay controles "server- public int AssignedToID { get; set; }
side" y no hay eventos, sino "vistas" que }
permiten la generación directa de códi-
go HTML [4]. public class PersonModel
Gracias a estas dos características, {
veremos que la inclusión e interacción de public int Id { get; set; }
código jQuery con los recursos que se public string Name { get; set; }
public string Department { get; set; }
publican desde el servidor se hace mucho
}
más fácil. Es por ello que decimos que
con ASP.NET MVC hay más poder y más
control, pero, ¿será factible el esfuerzo Listado 1. Modelo de datos
extra que se requiere?

Details.cshtml, Edit.cshtml, Index.


El control "Selección de persona" cshtml), utilizando en este caso el nue-
vo motor de vistas Razor [5] que viene
con jQuery y ASP.NET MVC con ASP.NET MVC 3.
Por simplicidad, en el ejemplo no se En la figura 1 se muestra la vista
utilizará una conexión a base de datos, para la creación de una nueva tarea
Figura 2. Validador que
sino una colección de objetos en (producida por Create.cshtml) con el
verifica que el texto sea un nombre
memoria. Supongamos un modelo que control de selección de personal fun-
válido en la lista de personas
tendrá una representación de Tareas y cionando. La idea consiste en permi-
Personas, como se muestra en el lis- tirle al usuario ir escribiendo un nom-
tado 1. Hay que resaltar que se utiliza bre y mientras ir desplegando un menú el usuario. A pesar de que se brinde un
la anotación con el atributo Required de selección (claro, con una cantidad menú desplegable para el autocom-
(System.ComponentModel.DataAnnota‐ de elementos que quepan en pantalla) pletado, como en toda interacción de
tions) para validar el modelo, que en que autocomplete el prefijo escrito por este tipo, el usuario sigue teniendo la
este caso significa que las propiedades libertad para escribir lo que desee; es
Description y AssignedToID tienen que necesario validar el valor que se escri-
contener valor. La gracia es que ba y mostrar un error según sea nece-
ASP.NET MVC posteriormente conver- sario (ver figura 2).
tirá dichas anotaciones en código Java- El código para cada operación
Script (utilizando el plug-in para vali- CRUD es bastante general. El listado 2
dación de jQuery, que se encuentra en muestra cómo sería el código para cre-
los ficheros jquery.validate.js y ar una tarea; en él se puede apreciar
jquery.validate.unobtrusive.min.j), que al hacer un pedido GET Tasks/Cre‐
para que en el cliente (en el navegador) ate simplemente se devuelve la vista
se haga la validación de la entrada de Create.cshtml y se espera por que el
datos sin realizar un envío (POST) al usuario introduzca los datos. Cuando
servidor. éste decide enviar los datos introduci-
Se creará un controlador llamado dos hacia el servidor, éstos se ligan
TasksController.cs, que será el res- automáticamente al modelo TaskModel
ponsable de implementar las opera- utilizando las características predeter-
ciones CRUD (Create, Retrieve, Update minadas de ASP.NET y simplemente se
y Delete) para las Tareas. Adicional- Figura 1. Menú desplegable con añaden al contexto de datos. La parte
autocompletado que facilita la
dotNetManía

mente, se crearán las respectivas vis- importante estaría entonces en cómo


selección de una persona
tas ( Create.cshtml , Delete.cshtml , desarrollar la vista Create.cshtml.

14
Una primera idea podría ser imple- un menú de selección que autocomple- datos en formato JSON mediante el
mentar desde cero el control deseado ta la palabra que el usuario escribe, dada método GET por problemas de seguri-
usando jQuery (para ver cómo usar una fuente de datos que se especifica dad [9], aunque este comportamiento
jQuery desde Visual Studio, el lector estáticamente o se carga dinámicamente puede forzarse especificando JsonRe‐
puede referirse a un artículo anterior vía AJAX. En el listado 3 puede verse su questBehavior.AllowGet . Lo intere-
de DNM [6]). No obstante, antes de utilización básica: se crea una caja de sante del uso de GET sobre POST es
empezar de cero siempre es recomen- texto con id actriz y se vincula el auto- que puede utilizarse el navegador web
dable realizar una búsqueda y verificar complete (uso del selector de id utili- para probar que la acción devuelva el
si ya existe algún control para esto, o zando la sintaxis #actriz), pasando una resultado adecuado (figura 3). No obs-
al menos alguno que tenga un com- lista de actrices como fuente de datos. tante, es recomendable el uso de un
portamiento similar para utilizarlo Para el desarrollo del control de selec- depurador de HTTP como Fiddler [10],

<script type="text/javascript">
public ActionResult Create() $(document).ready(function () {
{ $("#actriz").autocomplete({
return View(); source: ["Angelina Jolie", "Penélope Cruz", "Salma Hayek"]
} });
});
[HttpPost] </script>
public ActionResult Create(
TaskModel model) <input type="text" id="actriz" />
{
try
{ Listado 3. Uso básico del plug-in jQuery "autocomplete"
var context = new MyDatabase();
context.Insert(model);
context.SubmitChanges();
return RedirectToAction("Index");
ción de persona, será necesario que la que permite visualizar e interactuar con
}
catch
lista de personas se cargue dinámica- el tráfico HTTP.
{ mente vía AJAX, por lo que primera- Además de añadir código necesario
return View(model); mente hay que agregar una acción adi- para la funcionalidad del controlador de
} cional al controlador de tareas (listado tareas, hay que programar el comporta-
} 4) que devuelva mediante un pedido miento de la vista, que constará de dos
GET y en formato JSON el listado de las partes: el código HTML declarativo (que
primeras 10 personas cuyo nombre auto- representará la forma visual) y el código
Listado 2. Acciones que implementan la complete cierto prefijo. JavaScript activo, que pone el comporta-
creación de una nueva tarea De manera predeterminada, en miento (en este caso, el plug-in auto-
ASP.NET MVC no se permite devolver complete con jQuery).

como punto de partida. Para jQuery


recomendamos visitar http://plu‐
gins.jquery.com. Con la plantilla de public ActionResult Persons(string name)
{
proyecto predeterminada que se inclu-
var context = new MyDatabase();
ye en Visual Studio 2010 al instalar la return new JsonResult
distribución ASP.NET MVC 3 [7] se brin- {
dan a su vez un conjunto de plug-ins Data = context.GetRepository<PersonModel>()
jQuery listos para utilizar. Uno de estos .Where(p => p.Name.StartsWith(name))
es jQuery UI [8] ( jquery‐ui.js), que .Take(10),
es una biblioteca que incluye barras de JsonRequestBehavior = JsonRequestBehavior.AllowGet
progreso, cajas de diálogos modales, };
animaciones y uno que usaremos en }
especial para este artículo: autocom-
plete.
Listado 4. Acción que devuelve un array JSON con las personas (a lo sumo 10) cuyo nombre
dotNetManía

El plug-in jQuery autocomplete se comienza con el valor del parámetro name


vincula a una caja de texto y despliega

15
<Button x:Name="btnVisualPlayer" Grid.Column="1"
RenderTransformOrigin="0.5,0.5"
<div class="editor‐label">
@Html.LabelFor(model => model.AssignedTo)
</div>
<div class="editor‐field">
@Html.TextBox("AssignedTo")
@Html.HiddenFor(model => model.AssignedToID)
Figura 3. Utilizando la acción Persons @Html.ValidationMessageFor(model =>
desde el navegador web model.AssignedToID)
</div>

En ASP.NET MVC, ligar los datos del formulario


HTML y el objeto .NET que define el modelo (binding) Listado 5. Fragmento de código HTML que visualiza la caja
se hace de manera predeterminada utilizando el atri- de texto para la selección de persona, así como la etiqueta y
buto name de cada etiqueta HTML INPUT (controles el validador necesarios

En el listado 6 se muestra el código completo que


se añade a la vista Create.cshtml para darle este com-
portamiento a la caja de texto. Este código puede divi-
Una de las características más importantes dirse en tres partes para su análisis:
que brinda ASP.NET MVC es la Separación
• La configuración del pedido AJAX para solicitar la lis-
de Responsabilidades ta de personas y crear la fuente de datos.
• El formato personalizado de los elementos del menú
desplegable.
• La acción de selección (que actualiza el valor del con-
trol escondido cuyo atributo HTML name es igual a
HTML). Si el modelo (el tipo en .NET) tiene una pro- AssignedToID con el Id de la persona seleccionada)
piedad con nombre Prop1 y existe un control HTML
con atributo name cuyo valor sea Prop1 , entonces En este ejemplo, al plug-in autocomplete se le con-
automáticamente se le asigna el valor que se reciba figuran dos opciones source y select para definir, res-
en el FORM para Prop1 a la propiedad con el mismo pectivamente, la fuente de datos (AJAX) y la acción a
nombre en .NET5. ASP.NET MVC interpreta los tipos ejecutar cuando se seleccione un elemento. En source
básicos (int, float, bool, etc.) y hace la conversión se debe especificar una función que reciba dos pará-
automáticamente. Es por ello que si se quiere utilizar metros, request y response. El parámetro request des-
esta ligadura, se deben tener dos controles HTML, cribe el pedido (de manera especial, el valor introduci-
uno que almacene el nombre de usuario (autocom- do por el usuario se almacena en el miembro term del
pletado) y otro que almacene el Id, como se muestra request), y como parámetro response el plug-in auto-
en el listado 5. complete pasa una función (un callback asíncrono) que
Lo que queremos en este ejemplo es mostrar una se utiliza para rellenar la lista de elementos del menú
caja de texto donde el usuario pueda escribir (con desplegable asociado a la caja de texto una vez que se
autocompletado) el nombre de una persona, pero el haya realizado cierto procesamiento (que en este caso
valor de interés que se enviará al servidor no será el será un pedido AJAX).
nombre de usuario, sino el Id, que se almacena en Para poblar la fuente de datos se utiliza la función
un campo escondido (hidden) y está ligado automá- jQuery $.ajax, que permite realizar un pedido AJAX.
ticamente a la propiedad AssignedToID del modelo Como se muestra en el ejemplo, el pedido AJAX recibe
TaskModel. Entonces, será imprescindible diseñar un un objeto de configuración JSON con miembros que
mecanismo que permita rellenar automáticamente definen el comportamiento de dicho pedido. En el miem-
el Id adecuado cuando el usuario seleccione una per- bro url se configura a qué dirección se realiza el pedi-
sona válida. do, que en este caso es hacia la acción Persons previa-
dotNetManía

5
Esta ligadura es mucho más potente y compleja, ya que permite una sintaxis dot notation para navegar a más de un nivel
(Prop1.Prop2.Prop3), e incluso permite usar índices en caso de arrays con la sintaxis Prop[index].

16
<script type="text/javascript">
$(document).ready(function () {
$("#AssignedTo").change(function (e) {
$(‘#AssignedToID’).val("");
});
$("#AssignedTo").autocomplete({
source: function (request, response) {
$.ajax({
url: ‘@Url.Action("Persons")‘,
cache: true,
data: { name: request.term },
dataType: ‘json’,
type: ‘get’,
timeout: 10000,
success: function (data) {
var mappedData = $.map(data, function (item) {
return {
id: item.Id,
label: item.Name,
value: item.Name,
Department: item.Department
}
});
response(mappedData);
}
})
},
select: function (event, ui) {
$(‘#AssignedToID’).val(ui.item.id);
}
}).data("autocomplete")._renderItem = function (ul, item) {
return $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "<br/><b>Department: </b>" +
item.Department + ‘<div class="border"><div></a>’)
.appendTo(ul);
};
});
</script>

Listado 6. Código jQuery que da vida al control de selección de una persona, que no es más que una personalización del plug-in
autocomplete

mente definida en el controlador TasksController.cs, de especificar una función que se ejecuta cuando se reci-
mediante la combinación de código C# y JavaScript gra- be el resultado del servidor. En este caso, se cambia la
cias al motor Razor (url: ‘@Url.Action("Persons")’6). estructura del resultado (utilizando la función jQuery
En data se configuran los parámetros del query string $.map) para hacerlo compatible con el plug-in autocom-
en el pedido AJAX (en este caso el parámetro name), y plete, que espera un array de elementos con miembros
de manera adicional se configuran otros parámetros label y value (donde label especifica el valor que se
como cache, dataType, type y timeout, que se auto-des- muestra en el menú desplegable y value el valor que se
criben por su nombre. En el miembro success se pue- envía a la caja de texto cuando se realiza la selección), y

6
El código posterior a @ se interpreta como C# y se ejecuta en el servidor al procesar la vista. Automáticamente, Razor detecta
dotNetManía

dónde termina el código C# y dónde empieza nuevamente el código HTML (en este caso, el JavaScript embebido), eliminando
los molestos separadores de ASP.NET <%= %>.

17
Organizando el código jQuery
Aunque el código anterior funciona, no
es muy reusable que digamos, ya que
está fuertemente acoplado a los nom-
bres de los identificadores fijos (en este
caso #AssignedTo y #AssignedToID), por
lo que la reutilización en la vista
Edit.cshtml tendría que hacerse copian-
do el código, acción que viola el princi-
pio DRY (Don’t Repeat Yourself). Aun-
que JavaScript puede considerarse como
un lenguaje orientado a objetos, su con-
cepción es diferente a la de lenguajes
como C#. En principio, en JavaScript no
Figura 4. Relación entre el código HTML y su visualización existen clases sino prototipos, y no exis-
para el control de selección de persona ten constructores de objetos como
miembros de clases, sino funciones que
construyen objetos, las cuales pueden
se devuelve mediante la función callback .change(...)), que en este caso borra utilizarse de diferentes formas. Por ello,
response anteriormente descrita. el valor del campo AssignedToID. Como para lograr una unicidad en la creación,
Finalmente, utilizando la función el evento de selección del autocomplete cada biblioteca JavaScript brinda una
.data de jQuery se redefine la función se ejecuta después de lanzar cualquier manera de reusar código. La biblioteca
_renderItem del prototipo autocomple‐ evento onChange de la caja de texto, esta jQuery UI brinda un patrón conocido
te (que es lo que en este ejemplo define adición permitirá que cualquier edición como jQuery UI Widget Factory [11]
el autocomplete) asociado a la instancia que realice el usuario elimine el valor mediante el cual se puede extender el
del autocompletado que se está creando. de AssignedToID , para que así este comportamiento de un widget. No obs-
En jQuery las "extensiones" (plug-ins campo reciba valor una vez que se tante, como en este ejemplo lo que se
como autocomplete) asociadas a algún seleccione una persona válida. En caso quiere reusar son los parámetros de ini-
elemento HTML se almacenan en un de que no se rellene correctamente el cialización del plug-in autocomplete, es
espacio aparte, fuera del objeto DOM Id (producto de no realizar alguna mucho más sencillo crear un nuevo
(expando object) que representa al ele- selección), se disparará el validador método jQuery que se llame, por ejem-
mento, y son accedidas mediante la fun- Required de ASP.NET MVC para el plo, peoplePicker y que permita una uti-
ción .data. De esta forma, se puede rede- campo AssignedToID , obteniéndose lización como la que se muestra en el
finir el comportamiento predeterminado finalmente el comportamiento pro- listado 7.
de cualquier extensión. puesto para el control de selección de Para lograr esto, simplemente se crea
El menú desplegable que brinda el persona. un nuevo fichero de script (ui.People‐
plug-in autocomplete se presenta como
una lista HTML <ul></ul>, por lo que el
formato de cada elemento se codificará
entre etiquetas <li></li>. Para este ejem- <script src="@Url.Content("~/Scripts/ui.PeoplePicker.js")"
plo, además del nombre de usuario se type="text/javascript"></script>
mostrará el departamento al que perte- <script type="text/javascript">
nece, seguido por un separador perso- $(document).ready(function () {
nalizado definido mediante la clase CSS $("#AssignedTo").peoplePicker({
.border (figura 4). DisplayControl: "#AssignedTo",
Cuando se selecciona un elemento ValueControl: "#AssignedToID",
del menú desplegable, se ejecuta la fun- url: ‘@Url.Action("Persons")‘
ción definida en el miembro success, que });
en este caso actualiza el valor del campo });
AssignedToID mediante el código jQuery </script>
$(‘#AssignedToID’).val(ui.item.id).
Note que a la caja de texto se le vincula
dotNetManía

adicionalmente una acción cuando se Listado 7. Encapsulando la inicialización del widget autocomplete en el método peoplePicker
cambia el texto ( $("#AssignedTo") para simplificar la reusabilidad

18
Picker.js) con el esquema que se muestra en el lista- buena, al menos con el desarrollo tecnológico actual, ya
do 8 y se mueve al cuerpo del método peoplePicker el que no aprovecharía características como SEO (Search
código del listado 7 reemplazando los literales "#Assig‐ Engine Optimization) que permiten posicionar la web en
nedTo" y "#AssignedToID" por options.DisplayCon‐ los principales buscadores de Internet y acceder directa-
trol y options.ValueControl, respectivamente; y en el mente a la informaciones concretas que publique la apli-
pedido AJAX como url se utilizaría options.url. cación. La clave entonces sería que una aplicación pue-
De esta forma, se tendría el código del comporta- da balancear adecuadamente lo que se hace en el lado
miento en un fichero de script único que puede ser reu- del cliente y lo que se hace en el servidor. Y aquí es don-
tilizado desde cualquier vista en la que se requiera el de ASP.NET MVC resulta una plataforma ventajosa, ya
control selección de una persona. que nos brinda más poder y más control en comparación
con ASP.NET clásico, permitiéndonos inclinar la balan-
za a la posición deseada, al costo de tener en cuenta un
$.fn.extend({ nivel de detalle que dependerá de nuestro esfuerzo y de
peoplePicker: function (options) { nuestro conocimiento de HTML y HTTP.
// Código de inicialización Cierto que este principio, conocido como Do It Your-
} self (hágalo usted mismo), puede no ser ideal en todas
}); las situaciones. Es por ello que a la par de ASP .NET MVC
también se tiene una versión 4.0 de ASP .NET que inclu-
Listado 8. Caparazón que adiciona la función peoplePicker a ye muchas mejoras con respecto a la versión anterior. Es
jQuery de esperar que ASP.NET MVC, que es una tecnología rela-
tivamente joven (debutó en 2009), evolucione de tal mane-
ra que llegue a ser la herramienta por excelencia para el
desarrollo de aplicaciones web con tecnología .NET. Pero
Conclusiones por ahora, como se ha visto en este ejemplo sencillo,
requiere de cierto esfuerzo adicional, y de conocer más
Producto de la arquitectura cliente-servidor y desconec- detalles de HTML, HTTP y JavaScript.
tada de la Web, para desarrollar una aplicación web que Por tanto, la respuesta a la pregunta de ¿más esfuer-
cumpla con los requerimientos de la llamada Web 2.0 es zo? incluida en el título de este artículo dependerá de vues-
necesario que el desarrollador tenga claro qué parte deberá tro equipo de desarrollo. Es verdad que implica más tra-
desarrollarse en el cliente (HTML+JavaScript) y qué par- bajo, pero este gasto adicional debe tributarle un beneficio
te en el servidor. En esto hay que tener en cuenta que los mayor en cuanto a los requerimientos de su aplicación. Por
extremismos son malos. Una aplicación que desarrolle lo pronto, no está mal comenzar a intentarlo (el código del
la lógica totalmente en el servidor tiene la desventaja de proyecto puede descargarse del sitio web de dotNetManía),
que necesita más pedidos HTTP, lo cual es un inconve- mientras esperamos que en el futuro la tecnología haga
niente para los usuarios finales. Por otro lado, una apli- transparentes muchos de estos detalles que ahora pueden
cación que ejecute totalmente en el cliente tampoco es agobiar. t

Referencias
[ 1 ] Rapoza, Jim. RIA War Is Brewing. eWeek. [En línea]
http://etech.eweek.com/content/application_development/ria_war_is_brewing.html.
[ 2 ] Sitio web oficial de jQuery. [En línea] http://jquery.com.
[ 3 ] Sanderson, Steven. Pro ASP.NET MVC Framework. Apress, 2009.
[ 4 ] Esposito, Dino. Comparing Web Forms and ASP.NET MVC. MSDN Magazine. [En línea]
http://msdn.microsoft.com/en‐us/magazine/dd942833.aspx.
[ 5 ] Guthrie, Scott. Introducing "Razor" – a new view engine for ASP.NET. ScottGu’s Blog. [En línea]
http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing‐razor.aspx.
[ 6 ] Población, Alberto. Programación con jQuery en Visual Studio 2010. En dotNetManía nº 76.
[ 7 ] Microsoft. Sitio Web Oficial de ASP.NET MVC 3. [En línea] http://www.asp.net/mvc/mvc3.
[ 8 ] Sitio web oficial de jQuery UI. [En línea] http://jqueryui.com/.
[ 9 ] JSON Hijacking. Phil Haack’s blog. [En línea] http://haacked.com/archive/2009/06/25/json‐hijacking.aspx.
dotNetManía

[ 10 ] Fiddler Web Debugger - A free web debugging tool. [En línea] http://www.fiddler2.com.
[ 11 ] jQuery UI API Developer Guide. jQuery UI. [En línea] http://jqueryui.com/docs/Developer_Guide.

19
View publication stats

Anda mungkin juga menyukai