Documente Academic
Documente Profesional
Documente Cultură
NET
Escenarios
Incluir script de cliente personalizado en pginas ASP.NET
1. Escenarios
Use los scripts de cliente cuando desee hacer lo siguiente:
Mejorar la experiencia del usuario con pginas web ms enriquecidas, que son ms receptivas a las acciones
del usuario y presentan un comportamiento similar a las aplicaciones cliente tradicional. Por ejemplo, puede
usar scripts de cliente para comprobar los datos proporcionados con el teclado en un cuadro de texto a
medida que se escribe cada uno de los caracteres.
Agregar funcionalidad AJAX a las pginas web ASP.NET, lo que le permite hacer lo siguiente:
o Reducir las actualizaciones de pgina completa y evitar el parpadeo de la pgina mediante la
manipulacin dinmica de los elementos DOM de la pgina.
o Actualizar y administrar la interfaz de usuario sin necesidad de un postback al servidor.
o Organizar el cdigo en componentes de cliente. Los componentes de cliente son objetos
reutilizables que encapsulan JavaScript basado en Microsoft Ajax Library. Los componentes de
cliente tambin se pueden administrar mediante controles del lado servidor personalizados o
asociar a controles de servidor existentes para agregar funcionalidad de cliente.
Pag. 1 de 35
Puede incluir scripts de cliente de forma esttica en un bloque script que incluya cdigo o que use un
atributo include para hacer referencia a un archivo JavaScript (.js). Use esta opcin para insertar bloques de
script o archivos JavaScript que contengan scripts de cliente que no sea necesario crear dinmicamente y que
no requieran la funcionalidad AJAX adicional que proporciona Microsoft Ajax Library.
Puede crear y agregar dinmicamente el script de cliente a una pgina web ASP.NET mediante la
clase ClientScriptManager. Use esta opcin si desea crear scripts que dependan de informacin que solo est
disponible en tiempo de ejecucin.
Si desea aprovechar las caractersticas AJAX de ASP.NET, puede administrar los archivos de script de cliente
mediante el control de servidor ScriptManager. El control de servidor ScriptManager tambin garantiza que
Microsoft Ajax Library se cargue en el explorador antes de ejecutarse los scripts.
Nota
Puede hacer referencia a los controles de servidor ASP.NET en el script de cliente.
Una pgina web ASP.NET tambin puede tener acceso a un archivo de script al hacer referencia a este en el
atributo src de una etiqueta <script>, como en el ejemplo siguiente:
Pag. 2 de 35
scriptText += "}";
ClientScriptManager.RegisterClientScriptBlock(this.GetType(),
"CounterScript", scriptText, true);
TextBox1.Attributes.Add("onkeyup", "DisplayCharCount()");
LiteralControl spanLiteral = new
LiteralControl("<span id=\"spanCounter\"></span>");
PlaceHolder1.Controls.Add(spanLiteral);
}
}
Para los mtodos de la clase ClientScriptManager, se proporciona un tipo al que est asociado el bloque de script y se
asigna una clave a este bloque. Al proporcionar un tipo resulta ms fcil evitar colisiones si tanto la pgina como los
controles (controles personalizados o controles de usuario) agregan bloques de script a la misma pgina. El uso de una
clave permite evitar la duplicacin. Si llama a uno de los mtodos para agregar el script y ya existe un script con la
misma clave y el mismo tipo, el script no se vuelve a agregar.
El tipo y la clave proporcionados permiten evitar una duplicacin innecesaria. Por lo tanto, generalmente no tendr que
determinar de forma explcita si ya existe un bloque de script. Sin embargo, si es til en la aplicacin comprobar si ya
existe un bloque de script, puede llamar a los mtodos siguientes:
IsClientScriptBlockRegistered
IsClientScriptIncludeRegistered
IsOnSubmitStatementRegistered
IsStartupScriptRegistered
Nota
Si usa las caractersticas AJAX de cliente de ASP.NET, pero no las caractersticas basadas en servidor, use los mtodos
de la clase ClientScriptManager para insertar scripts en una pgina web ASP.NET. Por ejemplo, si no usa el
control UpdatePanel ni las caractersticas de localizacin de scripts, no necesita el control ScriptManager. Por
consiguiente, no puede llamar a sus mtodos para insertar el script de cliente en la pgina. El uso de los mtodos de la
clase ClientScriptManager suele ser ms eficaz que usar los mtodos del control ScriptManager. Esto se debe a que los
mtodos de la clase ClientScriptManager no requieren el procesamiento adicional de las caractersticas basadas en
servidor admitidas por el control ScriptManager. Si tiene que crear el script de forma dinmica (en lugar de
simplemente administrar el script existente), use la clase ClientScriptManager para insertar el script de cliente en una
pgina. Por ejemplo, use la clase ClientScriptManager si desea crear el script de cliente mediante programacin en
funcin de la informacin a la que un archivo de script ya existente no puede hacer referencia.
Herencia
Interfaces
Enumeraciones
Reflexin
Aplicaciones auxiliares de depuracin
Traza
Control de excepciones con tipo
Mtodos auxiliares para cadenas y matrices.
Nota
Pag. 3 de 35
Puede usar Microsoft Ajax Library aunque no tenga previsto usar las caractersticas AJAX para
servidores de ASP.NET.
Pag. 4 de 35
Establezca la propiedad OnClientClick del control como el script que se debe ejecutar. Cuando se representa
el control de botn, el valor de OnClientClick se convierte en un atributo onclick.
Agregue el atributo onclick mediante programacin llamando al mtodo Add de la coleccin Attributes del
control.
Nota
No puede agregar un atributo onclick mediante programacin a un control de servidor si este ya
usa onclick como parte de su funcionalidad bsica, como LinkButton.
En el ejemplo de cdigo siguiente se muestra un control Button que produce eventos Click en el cliente y en el servidor:
Use el control de servidor ASP.NET UpdatePanel. Este control forma parte de la funcionalidad AJAX de
ASP.NET. Permite definir una regin de una pgina que se actualizar con una actualizacin parcial de la
pgina. Cuando use el control UpdatePanel, no es necesario que escriba ningn script de cliente para invocar
las actualizaciones asincrnicas parciales de la pgina.
Use la compatibilidad con AJAX de ASP.NET para la comunicacin de servicios Web para escribir scripts de
cliente que invoquen un mtodo de servidor web. Este enfoque es conceptualmente similar a escribir su
propia devolucin de llamada del script de cliente para llamar a un mtodo de servidor web.Sin embargo,
Microsoft Ajax Library administra los detalles de la invocacin del mtodo de servidor y proporciona una
biblioteca de scripts de cliente ms slida para realizar y procesar la llamada.
Pag. 5 de 35
Implemente una devolucin de llamada de cliente. En este caso, se escribe el cdigo de cliente que enva la
solicitud y procesa el resultado. El enfoque ms comn es crear una funcin de llamada en el script de cliente
y una funcin de devolucin de llamada que se invoca cuando el servidor devuelve los resultados.
Cada enfoque tiene sus ventajas. Crear una devolucin de llamada de cliente propia suele ofrecer menos sobrecarga y
un tamao de pgina ms pequeo. Usar el control de servidor UpdatePanel permite implementar actualizaciones
parciales de la pgina sin necesidad de escribir ningn script de cliente. Usar AJAX para llamar a los servicios Web
tambin elimina la mayora de los scripts de cliente que debera escribir para realizar llamadas asincrnicas a los
servicios Web.
Obtener acceso al ciclo de vida de un componente desde la inicializacin a la eliminacin. Se incluyen los
eventos que se generan cuando cambian los valores de propiedad.
Representar un elemento DOM como un objeto de cliente que tiene una nueva funcionalidad. De esta manera
se ampla el comportamiento de elementos DOM. Por ejemplo, puede agregar un comportamiento de
impresin de marcas de agua que se puede asociar a un cuadro de texto existente.
Pag. 6 de 35
Las propiedades o mtodos que establecen el foco en controles usan el script de cliente. Por ejemplo, el
mtodo Control.Focus y el mtodo Page.SetFocus requieren el script de cliente.
Control
Button
Calendar
ChangePassword
DataPager
DetailsView
FormView
GridView
HtmlButton
HtmlForm
Pag. 7 de 35
ImageMap
LinkButton
LoginStatus
Menu
Page
PasswordRecovery
ScriptManager
Timer
TreeView
UpdatePanel
Controles validadores:
CompareValidator
CustomValidator
RangeValidator
RegularExpressionValidator
RequiredFieldValidator
ValidationSummary
el
Pag. 8 de 35
Wizard , CreateUserWizard
Escenarios
Utilizar el sistema de tipos
Utilizar las extensiones de los tipos base de JavaScript
Integrar scripts de cliente en aplicaciones web ASP.NET
1. Escenarios
Use las caractersticas de Microsoft Ajax Library incluidas en Visual Studio 2010 y Microsoft Visual Web Developer
Express cuando desee hacer lo siguiente:
Agregar capacidades orientadas a objetos al cdigo JavaScript para aumentar la reutilizacin, flexibilidad y
mantenimiento del cdigo.
Utilizar la reflexin para examinar la estructura y los componentes de los scripts de cliente en tiempo de
ejecucin.
Utilizar enumeraciones para proporcionar una alternativa fcilmente legible a las representaciones de enteros.
Utilizar las extensiones de depuracin y una caracterstica de traza para lograr una depuracin ms rpida y
ms informativa que con las tcnicas tradicionales de depuracin de JavaScript.
Utilizar las extensiones de los tipos base de JavaScript para reducir el tiempo de desarrollo de las tareas de
scripting comunes.
Espacios de nombres
Herencia
Interfaces
Enumeraciones
Reflexin
La biblioteca tambin proporciona funciones auxiliares para cadenas y matrices.
Pag. 9 de 35
this._emailAddress = emailAddress;
}
Demo.Person.prototype = {
getFirstName: function() {
return this._firstName;
},
getLastName: function() {
return this._lastName;
},
getName: function() {
return this._firstName + ' ' + this._lastName;
},
dispose: function() {
alert('bye ' + this.getName());
}
}
Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);
// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
Las clases pueden tener cuatro tipos de miembros: campos, propiedades, mtodos y eventos. Los campos y las
propiedades son pares de nombre y valor que describen las caractersticas de una instancia de una clase. Los campos
estn compuestos por tipos primitivos y son de acceso directo, como en el ejemplo siguiente:
myClassInstance.name="Fred"
Las propiedades pueden representar cualquier tipo primitivo o de referencia. El acceso a los valores de la propiedad se
obtiene con los mtodos de descriptor de acceso get y set. En Microsoft Ajax Library, los descriptores de acceso get y
set son funciones que, por convencin, utilizan el prefijo "get_" o "set_" en el nombre de la funcin. Por ejemplo, para
obtener o establecer un valor para una propiedad como cancel, llame a los mtodos get_cancel o set_cancel.
Microsoft Ajax Library provoca eventos en respuesta a las acciones que se producen durante el ciclo de vida de una
aplicacin cliente de AJAX. Microsoft Ajax Library tambin proporciona un mtodo estndar para crear eventos
personalizados para los componentes de cliente de AJAX.
Microsoft Ajax Library proporciona una manera de registrar los espacios de nombres con el fin de agrupar las
funcionalidades comunes. En el ejemplo siguiente se muestra cmo agregar una clase Person al espacio de
nombres Demo utilizando los mtodos Type.registerNamespace y .registerClass.
Para habilitar la funcionalidad de AJAX para una pgina web ASP.NET, debe agregar un control ScriptManager a la
pgina. Cuando se representa la pgina, se generan automticamente las referencias de script correspondientes a las
bibliotecas de scripts de cliente de AJAX. En el ejemplo siguiente se muestra una pgina con un control ScriptManager.
Pag. 10 de 35
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Namespace</title>
</head>
<body>
<form id="Main" runat="server">
<asp:ScriptManager runat="server" ID="scriptManager" />
</form>
<div>
<p>This example creates an instance of the Person class
and puts it in the "Demo" namespace.</p>
<input id="Button1" value="Create Demo.Person"
type="button" onclick="return OnButton1Click()" />
</div>
<script type="text/javascript" src="Namespace.js"></script>
<script type="text/javascript" language="JavaScript">
function OnButton1Click()
{
var testPerson = new Demo.Person(
'John', 'Smith', 'john.smith@example.com');
alert(testPerson.getFirstName() + " " +
testPerson.getLastName() );
return false;
}
</script>
</body>
</html>
Modificadores de acceso
La mayora de los lenguajes de programacin orientados a objetos incluyen el concepto de modificadores de acceso, que
permiten especificar en qu contextos est disponible una clase o miembro, por ejemplo, para programas externos,
clases internas dentro del mismo espacio de nombres o slo dentro de un bloque de cdigo concreto. No hay ningn
modificador de acceso en JavaScript. Sin embargo, en Microsoft Ajax Library, la convencin es que los miembros con
nombres que comienzan por el carcter de subrayado ("_") se consideran privados y no se tiene acceso a ellos fuera de
la clase de la que forman parte.
Herencia
La herencia es la capacidad de una clase de derivarse de otra clase. Una clase derivada hereda automticamente todos
los campos, propiedades, mtodos y eventos de la clase base. Una clase derivada puede agregar nuevos miembros o
invalidar los miembros existentes de la clase base para cambiar su comportamiento.
El ejemplo siguiente contiene dos clases definidas en el script: Person y Employee, donde Employee deriva
de Person. Ambas clases muestran el uso de los campos privados y ambas tienen propiedades y mtodos
pblicos. Adems, Employee invalida la implementacin toString de la clase Person y utiliza la funcionalidad de la clase
base.
Type.registerNamespace("Demo");
Demo.Person = function(firstName, lastName, emailAddress) {
this._firstName = firstName;
this._lastName = lastName;
this._emailAddress = emailAddress;
}
Demo.Person.prototype = {
getFirstName: function() {
return this._firstName;
},
getLastName: function() {
return this._lastName;
},
getEmailAddress: function() {
return this._emailAddress;
},
setEmailAddress: function(emailAddress) {
this._emailAddress = emailAddress;
},
getName: function() {
return this._firstName + ' ' + this._lastName;
},
Pag. 11 de 35
dispose: function() {
alert('bye ' + this.getName());
},
sendMail: function() {
var emailAddress = this.getEmailAddress();
if (emailAddress.indexOf('@') < 0) {
emailAddress = emailAddress + '@example.com';
}
alert('Sending mail to ' + emailAddress + ' ...');
},
toString: function() {
return this.getName() + ' (' + this.getEmailAddress() + ')';
}
}
Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);
Demo.Employee = function(firstName, lastName, emailAddress, team, title) {
Demo.Employee.initializeBase(this, [firstName, lastName, emailAddress]);
this._team = team;
this._title = title;
}
Demo.Employee.prototype = {
getTeam: function() {
return this._team;
},
setTeam: function(team) {
this._team = team;
},
getTitle: function() {
return this._title;
},
setTitle: function(title) {
this._title = title;
},
toString: function() {
return Demo.Employee.callBaseMethod(this, 'toString') + '\r\n' +
this.getTitle() + '\r\n' + this.getTeam();
}
}
Demo.Employee.registerClass('Demo.Employee', Demo.Person);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Inheritance</title>
</head>
<body>
<form id="Main" runat="server">
<asp:ScriptManager runat="server" ID="scriptManager" />
<script type="text/javascript" src="Inheritance.js"></script>
</form>
<h2>Inheritance</h2>
<p />
<div>
This file contains two classes defined in script: Person and Employee,
where Employee derives from Person.
<p />
Each class has private fields, and public properties and methods. In
addition, Employee overrides the toString implementation, and in doing
so, it uses the base class functionality.
<p />
This example puts the Person class in the "Demo" namespace.
<p />
</div>
<div>
<ul>
Pag. 12 de 35
Pag. 13 de 35
Interfaces
Una interfaz define los requisitos de entrada y salida de las clases que la implementan. Esto permite a una funcin
interactuar con las clases que implementan la misma interfaz independientemente de qu otra funcionalidad
implementa la clase.
En el ejemplo siguiente se definen una clase base Tree y una interfaz IFruitTree. Apple y Banana, dos clases derivadas,
implementan la interfaz IFruitTree, pero la clase Pine no la implementa. Cualquier clase que implemente la
interfaz IFruitTree garantiza que un mtodo bearFruit es miembro de esa clase.
Type.registerNamespace("Demo.Trees");
Demo.Trees.IFruitTree = function() {}
Demo.Trees.IFruitTree.Prototype = {
bearFruit: function(){}
}
Demo.Trees.IFruitTree.registerInterface('Demo.Trees.IFruitTree');
Demo.Trees.Tree = function(name) {
this._name = name;
}
Demo.Trees.Tree.prototype = {
returnName: function() {
return this._name;
},
toStringCustom: function() {
return this.returnName();
},
makeLeaves: function() {}
}
Demo.Trees.Tree.registerClass('Demo.Trees.Tree');
Demo.Trees.FruitTree = function(name, description) {
Demo.Trees.FruitTree.initializeBase(this, [name]);
this._description = description;
}
Demo.Trees.FruitTree.prototype.bearFruit = function() {
return this._description;
}
Demo.Trees.FruitTree.registerClass('Demo.Trees.FruitTree', Demo.Trees.Tree,
Demo.Trees.IFruitTree);
Demo.Trees.Apple = function() {
Demo.Trees.Apple.initializeBase(this, ['Apple', 'red and crunchy']);
}
Demo.Trees.Apple.prototype = {
makeLeaves: function() {
alert('Medium-sized and desiduous');
},
toStringCustom: function() {
return 'FruitTree ' + Demo.Trees.Apple.callBaseMethod(this,
'toStringCustom');
}
}
Demo.Trees.Apple.registerClass('Demo.Trees.Apple', Demo.Trees.FruitTree);
Demo.Trees.GreenApple = function() {
Demo.Trees.GreenApple.initializeBase(this);
// You must set the _description feild after initializeBase
// or you will get the base value.
this._description = 'green and sour';
}
Demo.Trees.GreenApple.prototype.toStringCustom = function() {
return Demo.Trees.GreenApple.callBaseMethod(this, 'toStringCustom') + ' ... its
GreenApple!';
Pag. 14 de 35
}
Demo.Trees.GreenApple.registerClass('Demo.Trees.GreenApple', Demo.Trees.Apple);
Demo.Trees.Banana = function(description) {
Demo.Trees.Banana.initializeBase(this, ['Banana', 'yellow and squishy']);
}
Demo.Trees.Banana.prototype.makeLeaves = function() {
alert('Big and green');
}
Demo.Trees.Banana.registerClass('Demo.Trees.Banana', Demo.Trees.FruitTree);
Demo.Trees.Pine = function() {
Demo.Trees.Pine.initializeBase(this, ['Pine']);
}
Demo.Trees.Pine.prototype.makeLeaves = function() {
alert('Needles in clusters');
}
Demo.Trees.Pine.registerClass('Demo.Trees.Pine', Demo.Trees.Tree);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Interface</title>
</head>
<body>
<form id="Main" runat="server">
<asp:ScriptManager runat="server" ID="scriptManager" />
</form>
<h2>Interface</h2>
<p />
<div>
This file contains a Tree base class, and an IFruitTree interface.
Apple and Banana, two derived classes implement that interface,
whereas, Pine does not implement that interface.
<p />
</div>
<script type="text/javascript" src="Interface.js"></script>
<div>
<ul>
<li><a href="#" onclick="return OnTestNewClick()">
Object Creation</a></li>
<li><a href="#" onclick="return OnTestImplementsClick()">
Implements Check</a></li>
<li><a href="#" onclick="return OnTestInterfaceMethodClick()">
Call interface method</a></li>
</ul>
</div>
<script type="text/javascript" language="JavaScript">
function OnTestNewClick() {
var apple = new Demo.Trees.Apple('Apple');
alert(apple.returnName());
apple.makeLeaves();
return false;
}
function OnTestImplementsClick() {
var apple = new Demo.Trees.Apple();
if (Demo.Trees.IFruitTree.isImplementedBy(apple)) {
alert('Apple implements IFruitTree');
}
else {
alert('Apple does not implement IFruitTree');
}
var pine = new Demo.Trees.Pine();
if (Demo.Trees.IFruitTree.isImplementedBy(pine)) {
alert('Pine implements IFruitTree');
Pag. 15 de 35
}
else {
alert('Pine does not implement IFruitTree');
}
return false;
}
function OnTestInterfaceMethodClick() {
var apple = new Demo.Trees.Apple();
ProcessTree(apple);
var pine = new Demo.Trees.Pine();
ProcessTree(pine);
var banana = new Demo.Trees.Banana();
ProcessTree(banana);
var g = new Demo.Trees.GreenApple();
ProcessTree(g);
return false;
}
function ProcessTree(tree) {
alert('Current Tree ' + tree.returnName());
alert(tree.toStringCustom());
if (Demo.Trees.IFruitTree.isImplementedBy(tree)) {
alert(tree.returnName() + ' implements IFruitTree; Fruit is ' +
tree.bearFruit());
}
}
</script>
</body>
</html>
Enumeraciones
Una enumeracin es una clase que contiene un conjunto de constantes enteras con nombre. El acceso a los valores,
como las propiedades, se realiza como en el ejemplo siguiente:
myObject.color = myColorEnum.red
Las enumeraciones proporcionan una alternativa fcilmente legible a las representaciones de enteros. En el ejemplo
siguiente se define una enumeracin de colores con nombre que representan valores hexadecimales.
Type.registerNamespace("Demo");
// Define an enumeration type and register it.
Demo.Color = function(){};
Demo.Color.prototype =
{
Red:
0xFF0000,
Blue:
0x0000FF,
Green: 0x00FF00,
White: 0xFFFFFF
}
Demo.Color.registerEnum("Demo.Color");
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Enumeration</title>
</head>
<body>
<form id="Main" runat="server">
<asp:ScriptManager runat="server" ID="scriptManager" />
</form>
<div>
<p>This example creates an Enumeration of colors
and applies them to page background.</p>
<select id="ColorPicker"
onchange="ChangeColor(options[selectedIndex].value)">
<option value="Red" label="Red" />
<option value="Blue" label="Blue" />
Pag. 16 de 35
Reflexin
La reflexin es la capacidad de examinar la estructura y los componentes de un programa en tiempo de ejecucin. Las
API que implementan la reflexin son extensiones de la clase Type. Estos mtodos permiten recopilar informacin sobre
un objeto, por ejemplo, de quin hereda, si implementa una interfaz determinada y si es una instancia de una clase
determinada.
En el ejemplo siguiente se utilizan API de reflexin para probar la clase GreenApple del ejemplo de interfaz anterior.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Reflection</title>
</head>
<body>
<form id="Main" runat="server">
<asp:ScriptManager runat="server" ID="scriptManager" />
</form>
<div>
<p>This example tests the Demo.Trees.GreenApple class
against various reflection APIs.</p>
<input id="Button1" value="Check Type"
type="button" onclick="return OnButton1Click()" />
<input id="Button2" value="Check Inheritance"
type="button" onclick="return OnButton2Click()" />
<input id="Button3" value="Check Interface"
type="button" onclick="return OnButton3Click()" />
</div>
<script type="text/javascript" src="Interface.js"></script>
<script type="text/javascript" language="JavaScript">
var g = new Demo.Trees.GreenApple();
var gt = Demo.Trees.GreenApple;
var a = new Array(
Demo.Trees.Apple,
Demo.Trees.Tree,
Demo.Trees.Pine,
Demo.Trees.IFruitTree,
Sys.IContainer);
function OnButton1Click()
{
for (var i = 0; i < a.length; i ++)
{
if (a[i].isInstanceOfType(g))
{
alert(gt.getName() + " is a " + a[i].getName() + ".");
}
else alert(gt.getName() + " is not a " + a[i].getName() + ".");
}
}
function OnButton2Click()
{
for (var i = 0; i < a.length; i ++)
Pag. 17 de 35
{
if (gt.inheritsFrom(a[i]))
{
alert(gt.getName() + " inherits from " + a[i].getName() + ".");
}
else alert(gt.getName() + " does not inherit from " +
a[i].getName() + ".");
}
}
function OnButton3Click()
{
for (var i = 0; i < a.length; i ++)
{
if (Type.isInterface(a[i]))
{
if (gt.implementsInterface(a[i]))
{
alert(gt.getName() + " implements the " + a[i].getName() +
" interface.");
}
else alert(gt.getName() + " does not implement the " +
a[i].getName() + " interface.");
}
else alert(a[i].getName() + " is not an interface.");
}
}
</script>
</body>
</html>
MyScript.js (comercial)
MyScript.debug.js (depuracin)
Pag. 18 de 35
Nota
Este escenario no es habitual para los desarrolladores de pginas, porque la mayora de los controles con
bibliotecas de scripts incrustadas hacen referencia a sus scripts internamente.
Los scripts tambin se pueden registrar mediante programacin creando referencias de script en el cdigo y, a
continuacin, agregndolos a la coleccin Scripts.
Puede registrar los scripts necesarios para las actualizaciones parciales de la pgina utilizando los mtodos de registro
del control ScriptManager. Puede utilizar estos mtodos de las siguientes maneras:
Para generar el script de cliente en el cdigo, genere un bloque de script como una cadena y pselo al
mtodo RegisterClientScriptBlock.
Para agregar archivos de script independientes que no tienen ninguna dependencia de Microsoft Ajax Library,
utilice el mtodo RegisterClientScriptInclude.
Para agregar archivos de script que se incrustan en un ensamblado, utilice el mtodo RegisterClient
ScriptInclude.
Nota
Los scripts que se registran con estos mtodos no admiten la localizacin.
Los bloques de scripts o scripts insertados que vaya a registrar deben estar dentro del elemento form de la pgina. De
lo contrario, el script no se registra con el control ScriptManager y no tiene acceso a la funcionalidad AJAX de ASP.NET.
Nota
Puede hacer referencia a los controles mediante el identificador en el script de cliente.
Para agregar un evento onclick de script de cliente a los botones es necesario seguir un procedimiento especial, que se
explica ms adelante en este tema.
Nota
La compatibilidad con el script de cliente depende del explorador. Por ejemplo, Microsoft Internet Explorer,
Mozilla Firefox y los exploradores para dispositivos mviles pueden proporcionar tipos de compatibilidad
distintos para el script de cliente.
En el formato del control, agregue un atributo para el evento, por ejemplo, onmouseover u onkeyup. Para el
valor del atributo, agregue el script de cliente que desea ejecutar.
Nota
Agregue siempre un punto y coma (;) a continuacin del script de cliente en el atributo. Esto es
necesario para que, si ASP.NET genera el script de cliente para el control (por ejemplo, si la
propiedad AutoPostBack del control est establecida en true), el cdigo se ejecute en primer lugar.
Los pares de atributo y valor del formato del control que no se corresponden con las propiedades de ste se
pasan al explorador tal y como estn.
Pag. 19 de 35
En el evento Init o Load de la pgina, llame al mtodo Add de la coleccin Attributes del control.
En el ejemplo de cdigo siguiente se muestra cmo agregar un script de cliente a un control TextBox. El script
de cliente muestra la longitud del texto en el control TextBox. El script presupone que la pgina contiene un
protected void Page_Load(object sender, EventArgs e)
{
String displayControlName = "spanCounter";
TextBox1.Attributes.Add("onkeyup", displayControlName +
".innerText=this.value.length;");
}
Pag. 20 de 35
Nota
Tambin puede agregar eventos de cliente, como onmouseover y onkeyup, a ciertos controles.
En el cdigo del servidor, llame a uno de los mtodos mostrados en la tabla siguiente.
Mtodo
Descripcin
RegisterClientScriptBlock
RegisterClientScriptInclude
RegisterStartupScript
RegisterOnSubmitStatement
El siguiente ejemplo de cdigo muestra cmo agregar script de cliente a una pgina que se ejecuta cuando el
usuario hace clic en un botn. El botn tiene un identificador de ConfirmSubmit y devuelve la pgina al
servidor. El script de cliente muestra una ventana emergente que solicita al usuario que confirme la devolucin
de datos.
protected void Page_Load(Object sender, EventArgs e)
{
String scriptText = "return confirm('Do you want to submit the page?')";
ClientScript.RegisterOnSubmitStatement(this.GetType(), "ConfirmSubmit",
scriptText);
}
El siguiente ejemplo de cdigo muestra cmo agregar a la pgina cdigo de cliente generado
dinmicamente. El cdigo comprueba si est activada una casilla que tiene un identificador
de checkDisplayCount. En caso afirmativo, el cdigo realiza las siguientes tareas:
o Crea una funcin de script de cliente que utiliza un elemento span para mostrar el recuento de
caracteres en un control TextBox denominado TextBox1.
o Agrega un evento de cliente al control TextBox.
o Genera el elemento span.
El cdigo supone que la pgina contiene una casilla denominada checkDisplayCount con su
propiedad AutoPostBack establecida en true y un control PlaceHolder denominado PlaceHolder1.
Pag. 21 de 35
Nota
Todos los archivos de script que se van a registrar con el control ScriptManager deben llamar al
mtodo notifyScriptLoaded para notificar a la aplicacin que el script ha terminado de cargarse. Los scripts
que se basan en ensamblados no deberan llamar a este mtodo en la mayora de los casos.
2.
3.
Pag. 22 de 35
4.
5.
SRef.Path = "~/Scripts/Script.js";
Si el script forma parte de un ensamblado, establezca las propiedades Name y Assembly de la instancia
ScriptReference.
SRef.Name = "Script.js";
SRef.Assembly = "ScriptAssembly";
Especifique si desea ejecutar versiones de depuracin o de lanzamiento del script. Para establecer este modo
para todos los scripts de la pgina, establezca la propiedad ScriptMode del control ScriptManager. Para
establecer el modo depuracin para un script individual, establezca la propiedad ScriptMode del
objeto ScriptReference.
El ejemplo siguiente muestra ambas opciones.
// To set ScriptMode for all scripts on the page...
Smgr.ScriptMode = ScriptMode.Release;
//Or, to set the ScriptMode just for the one script...
SRef.ScriptMode = ScriptMode.Debug;
//If they conflict, the setting on the ScriptReference wins.
// To set ScriptMode for all scripts on the page...
Smgr.ScriptMode = ScriptMode.Release;
//Or, to set the ScriptMode just for the one script...
SRef.ScriptMode = ScriptMode.Debug;
//If they conflict, the setting on the ScriptReference wins.
Nota
Si no est establecida la propiedad Path del objeto ScriptReference, la propiedad ScriptMode del
control ScriptManager se establece en Release de forma predeterminada. Si est establecida la
propiedad Path del objeto ScriptReference, el control ScriptManager buscar los scripts de depuracin y
de lanzamiento, a menos que su propiedad ScriptMode est establecida en un modo concreto.
6.
Requisitos previos
Para implementar los procedimientos de este tutorial necesitar:
Nota
No puede usar Visual Web Developer 2005 Express Edition, porque Visual Web Developer Express no
permite crear el proyecto de bibliotecas de clase que precisa el tutorial.
Pag. 23 de 35
s.borderWidth = '2px';
s.borderColor = this._color;
s.borderStyle = 'solid';
window.setTimeout(
function() {{
s.borderWidth = 0;
}},
500);
5.
6.
7.
}
}
El cdigo contiene una funcin JavaScript que muestra temporalmente un borde basado en el color alrededor
de un control UpdatePanel.
En la ventana Propiedades del archivo UpdatePanelAnimation.js, establezca Accin de generacin en
Recurso incrustado.
Pag. 24 de 35
{
_animate = value;
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (Animate)
{
UpdatePanel updatePanel = (UpdatePanel)
FindControl(UpdatePanelID);
string script = String.Format(
CultureInfo.InvariantCulture,
@"Sys.Application.add_load(function(sender, args)
{{var {0}_borderAnimation = new BorderAnimation('{1}');
var panelElement = document.getElementById('{0}');
if (args.get_isPartialLoad()) {{
{0}_borderAnimation.animate(panelElement);
}}
}})",
updatePanel.ClientID,
ColorTranslator.ToHtml(BorderColor));
ScriptManager.RegisterStartupScript(this,
typeof(UpdatePanelAnimationWithClientResource),
ClientID, script, true);
}
}
8.
}
}
Esta clase contiene las propiedades para personalizar el borde que se muestra alrededor del control
UpdatePanel. El cdigo tambin registra cdigo JavaScript para utilizarlo en una pgina web. El cdigo crea
un controlador para el evento load del objeto Sys.Application. Se llama a la funcin animate del archivo
UpdatePanelAnimation.js cuando se procesa una actualizacin parcial de la pgina.
Agregue la siguiente lnea al archivo AssemblyInfo.
[assembly: System.Web.UI.WebResource("SampleControl.UpdatePanelAnimation.js",
"application/x-javascript")]
Nota
El archivo AssemblyInfo.vb est en el nodo My Project del Explorador de soluciones. Si no ve ningn
archivo en el nodo My Project, en el menProyecto, haga clic en Mostrar todos los archivos. El
archivo AssemblyInfo.cs est en el nodo Propiedades del Explorador de soluciones.
9.
La definicin WebResource debe incluir el espacio de nombres predeterminado del ensamblado y el nombre
del archivo .js.
Compile el proyecto.
Cuando finalice la compilacin, tendr un ensamblado denominado SampleControl.dll. El cdigo JavaScript
del archivo UpdatePanelAnimation.js se incrusta en este ensamblado como un recurso.
Nota
Aunque puede crear el proyecto de bibliotecas de clase y el sitio web en la misma solucin de Visual Studio, en
este tutorial no se supone que se haga esto. Si los proyectos se encuentran en soluciones independientes, se
emula la forma en que un desarrollador de controles y un desarrollador de pginas trabajaran por separado. Sin
embargo, por mayor comodidad, puede crear ambos proyectos en la misma solucin y realizar pequeos ajustes
en los procedimientos del tutorial.
Pag. 25 de 35
Copie SampleControl.dll del directorio Bin\Debug o Bin\Release del proyecto de bibliotecas de clase a la
carpeta Bin del sitio web.
Nota
Si cre el proyecto de bibliotecas de clase y el sitio web en la misma solucin de Visual Studio, puede
agregar una referencia del proyecto de bibliotecas de clase al sitio web.
4.
5.
Pag. 26 de 35
Implementar la interfaz ICallbackEventHandler. Puede agregar esta declaracin de interfaz a cualquier pgina
Web ASP.NET.
Proporcione una implementacin para el mtodo RaiseCallbackEvent. Este mtodo se invocar para realizar la
devolucin de llamada en el servidor.
Proporcione una implementacin para el mtodo GetCallbackResult. Este mtodo devolver el resultado de la
devolucin de llamada al cliente.
Adems, la pgina debe contener tres funciones de script de cliente que realicen las acciones siguientes:
Una funcin que llama a un mtodo auxiliar que realiza la solicitud real al servidor. En esta funcin, puede
incluir lgica personalizada para preparar en primer lugar los argumentos de evento. Puede enviar una cadena
como parmetro al controlador de eventos de servidor de devolucin de llamadas de cliente.
Otra funcin que recibe (y a la que llama) el resultado del cdigo de servidor que ha procesado el evento de
devolucin de llamada y acepta una cadena que representa los resultados. Esto se conoce como la funcin de
devolucin de llamada del cliente.
Una tercera funcin es la funcin auxiliar que realiza la solicitud real al servidor. ASP.NET genera
automticamente esta funcin cuando se genera una referencia a ella mediante el mtodo GetCallbackEvent
Reference en cdigo de servidor.
Tanto las devoluciones de llamada del cliente como las devoluciones de datos son solicitudes para la pgina de
origen. Por tanto, ambas devoluciones se graban en los registros del servidor web como una solicitud de pgina.
Nota
Para el nombre de la interfaz se distingue entre maysculas y minsculas.
Pag. 27 de 35
{
}
El mtodo GetCallbackResult no toma ningn argumento y devuelve una cadena. Parte de este mtodo podra ser
similar al siguiente ejemplo:
public string GetCallbackResult()
{
return aStringValue;
}
Pag. 28 de 35
Para un control de usuario o una pgina de un solo archivo, implemente la interfaz ICallbackEventHandler
utilizando una directiva @ Implements en la pgina, como se muestra en el ejemplo siguiente.
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
Nota
Si utiliza un modelo de pgina de cdigo subyacente, implemente la interfaz ICallbackEventHandler
para la clase parcial.
2.
3.
Pag. 29 de 35
Ejemplo
Descripcin
El ejemplo de cdigo siguiente se compone de dos partes. La primera parte muestra una pgina Web ASP.NET (la
pgina .aspx). La segunda parte muestra el archivo de cdigo subyacente correspondiente (el archivo .aspx.cs).
Nota
El ejemplo requiere que la pgina se denomine ClientCallback.aspx y el archivo de cdigo subyacente se
denomine ClientCallback.aspx.cs.
Cdigo
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="ClientCallback.aspx.cs" Inherits="ClientCallback" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Client Callback Example</title>
<script type="text/ecmascript">
function LookUpStock()
{
var lb = document.getElementById("ListBox1");
var product = lb.options[lb.selectedIndex].text;
CallServer(product, "");
}
function ReceiveServerData(rValue)
{
document.getElementById("ResultsSpan").innerHTML = rValue;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="ListBox1" Runat="server"></asp:ListBox>
<br />
<br />
<button type="Button" onclick="LookUpStock()">Look Up Stock</button>
<br />
<br />
Items in stock: <span id="ResultsSpan" runat="server"></span>
<br />
</div>
</form>
</body>
</html>
using
using
using
using
using
using
using
using
using
using
System;
System.Data;
System.Configuration;
System.Collections;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Web.UI.HtmlControls;
Pag. 30 de 35
Comentarios
La pgina Web emula una bsqueda de base de datos para determinar el nmero de elementos disponibles, o en
existencias, para una serie de productos (monitores, teclados, etc.). Para simplificar este ejemplo de cdigo, la base de
datos est representada por una lista de diccionario que contiene un pequeo grupo de elementos. Para cada elemento
de la tabla, la clave es el nombre del elemento (por ejemplo, monitor) y el valor es el nmero de elementos que hay en
existencias. En una aplicacin de produccin, se utilizara una base de datos.
Cuando se ejecuta la pgina, se enlaza un control ListBox a la tabla hash para que el control ListBox muestre la lista de
productos. La pgina tambin contiene un elemento button (no un control de servidor Web Button), cuyo
evento onclick est enlazado a una funcin de cliente denominada LookUpStock. Cuando los usuarios hacen clic en el
botn, ste ejecuta la funcin LookUpStock, que obtiene la seleccin actual del cuadro de lista y, a continuacin, realiza
la devolucin de llamada del cliente llamando a la funcin CallServer.
La pgina de cdigo subyacente agrega scripts de cliente a la pgina a travs del mtodo RegisterClientScriptBlock. El
script que se agrega a la pgina incluye una funcin denominada CallServer, que obtiene el nombre del mtodo que
realiza la devolucin de datos al servidor desde el mtodo GetCallbackEventReference.
La devolucin de llamada del cliente invoca al mtodo RaiseCallbackEvent para determinar las existencias disponibles
para el producto que se le ha pasado. El mtodo GetCallbackResult devuelve el valor. Tenga en cuenta que los
argumentos enviados entre el script de cliente y el cdigo del servidor slo pueden ser cadenas. Para pasar o recibir
varios valores, stos se pueden concatenar en la cadena de entrada o en la cadena devuelta, respectivamente.
Pag. 31 de 35
Nota
La validacin de eventos permite proteger la aplicacin Web contra devoluciones (postbacks) manipuladas,
pero no sirve para protegerse de ataques de reproduccin. Un plan de validacin de eventos ms completo
debera tener en cuenta las caractersticas especficas de su aplicacin Web y los permisos del usuario que tiene
acceso a sus recursos.
El ejemplo que aqu se describe es una ampliacin del Ejemplo de implementacin de devolucin de llamada de cliente
(C#). En esos ejemplos, un control ListBox denominado ListBox1 es un control del servidor que muestra una lista de
productos. Un elemento <button> HTML (no un control de servidor Button) realiza una devolucin de llamada para
obtener informacin del inventario de productos. El ejemplo se ha ampliado para incluir informacin adicional sobre si
un producto est en venta y para permitir que esta informacin slo la vean los usuarios autenticados. Para mostrar el
contenido adicional, se utiliza un control LoginView con la propiedad LoggedInTemplate definida. A los usuarios
annimos de la pgina Web se les permite ejecutar una devolucin de llamada para obtener informacin del inventario,
mientras que a los usuarios registrados se les permite adems ejecutar una devolucin de llamada para obtener
informacin sobre las ventas. La devolucin de llamada de la informacin de ventas slo se registra para la validacin de
eventos si el usuario est autenticado. De esta forma, se evita que los usuarios que no estn autenticados ejecuten
devoluciones de llamada.
Ejemplo
Descripcin
En el ejemplo siguiente, una pgina Web simula una bsqueda en la base de datos para determinar el nmero de
productos que estn disponibles y si un producto est en venta. Para simplificar el ejemplo, el almacn de datos se
representa mediante dos listas de diccionario. En una aplicacin de produccin, se utilizara una base de datos. En el
ejemplo se muestra una situacin en la que, al validar las devoluciones de llamadas del cliente, se impide que un usuario
annimo ejecute una devolucin de llamada concebida nicamente para los usuarios autenticados.
Cdigo
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="ClientCallback.aspx.cs" Inherits="ClientCallback" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>ASP.NET Example</title>
<script type="text/javascript">
function ReceiveServerData(rValue)
{
Results.innerText = rValue;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListBox id="ListBox1" runat="server"></asp:ListBox>
<br />
<br />
<button id="LookUpStockButton" type="button"
onclick="LookUpStock()">Look Up Stock</button>
<asp:LoginView id="LoginView1" runat="server">
<LoggedInTemplate>
<button id="LookUpSaleButton" type="button"
onclick="LookUpSale()">Look Up Back Order</button>
</LoggedInTemplate>
Pag. 32 de 35
</asp:LoginView>
<br />
Item status: <span id="Results"></span>
</div>
</form>
</body>
</html>
using
using
using
using
using
using
using
using
using
using
System;
System.Data;
System.Configuration;
System.Collections;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Web.UI.HtmlControls;
Pag. 33 de 35
ListBox1.DataTextField = "key";
ListBox1.DataBind();
}
public void RaiseCallbackEvent(String eventArgument)
{
string[] argParts = eventArgument.Split('|');
if ((argParts == null) || (argParts.Length != 2))
{
returnValue = "A problem occurred trying to retrieve stock
count.";
return;
}
string product = argParts[0];
string validationaction = argParts[1];
switch (validationaction)
{
case "LookUpStock":
try
{
Page.ClientScript.ValidateEvent("LookUpStockButton",
validationaction);
if (catalog[product] == null)
{
returnValue = "Item not found.";
}
else
{
returnValue = catalog[product].ToString() +
" in stock.";
}
}
catch
{
returnValue = "Can not retrieve stock count.";
}
break;
case "LookUpSale":
try
{
Page.ClientScript.ValidateEvent("LookUpSaleButton",
validationaction);
if (saleitem[product] == null)
{
returnValue = "Item not found.";
}
else
{
if (Convert.ToBoolean(saleitem[product]))
returnValue = "Item is on sale.";
else
returnValue = "Item is not on sale.";
}
}
catch
{
returnValue = "Can not retrieve sale status.";
}
break;
}
}
public String GetCallbackResult()
{
return returnValue;
Pag. 34 de 35
}
protected override void Render(HtmlTextWriter writer)
{
Page.ClientScript.RegisterForEventValidation("LookUpStockButton",
validationLookUpStock);
if (User.Identity.IsAuthenticated)
{
Page.ClientScript.RegisterForEventValidation("LookUpSaleButton",
validationLookUpSale);
}
base.Render(writer);
}
}
Comentarios
La pgina Web emula una bsqueda de base de datos para determinar el nmero de elementos disponibles, o en
existencias, para una serie de productos (monitores, teclados, etc.). Para simplificar este ejemplo de cdigo, la base de
datos est representada por una lista de diccionario que contiene un pequeo grupo de elementos. Para cada elemento
de la tabla, la clave es el nombre del elemento (por ejemplo, monitor) y el valor es el nmero de elementos que hay en
existencias. En una aplicacin de produccin, se utilizara una base de datos.
Cuando se ejecuta la pgina, se enlaza un control ListBox a la tabla hash para que el control ListBox muestre la lista de
productos. Para los usuarios autenticados, la pgina se representa con dos elementos <button> HTML cuyos
eventos onclick se enlazan a dos funciones de cliente denominadas LookUpStock y LookUpSale, respectivamente. Para
los usuarios annimos, la pgina se representa con slo un elemento <button> HTML, cuyo evento onclick se enlaza a
LookUpStock. Se utiliza un control LoginView para especificar los botones que se muestran. En un evento Render
reemplazado de la pgina, los botones se registran para la validacin. Si el usuario no est autenticado, no se registra el
botn que inicia la devolucin de llamada para LookUpSale y cualquier intento de realizar una devolucin de llamada
producir un error.
La pgina de cdigo subyacente agrega scripts de cliente a la pgina a travs del mtodo RegisterClientScriptBlock. El
script que se agrega a la pgina incluye una funcin denominada CallServer, que obtiene el nombre del mtodo que
realiza la devolucin (postback) al servidor desde el mtodo GetCallbackEventReference.
La devolucin de llamada del cliente invoca al mtodo RaiseCallbackEvent para determinar las existencias disponibles
para el producto que se le ha pasado. El mtodo GetCallbackResult devuelve el valor. Tenga en cuenta que los
argumentos enviados entre el script de cliente y el cdigo del servidor slo pueden ser cadenas. Para pasar o recibir
varios valores, puede concatenar los valores en la cadena de entrada o en la cadena devuelta, respectivamente.
Pag. 35 de 35