2009-04-25 14 views
5

Solo estoy entrando en más cosas del lado del cliente en ASP.NET usando Javascript, y hay algo que me preocupa que espero que alguien pueda explicar. ¿Por qué Intellisense no muestra todos los atributos/propiedades de un control .NET? Por ejemplo, un ListItem en un RadioButtonListControl:ASP.NET Intellisense frente a los atributos del lado del cliente

<asp:ListItem Value="1" Text="Yes" onclick="alert('TEST1');" /> 
<asp:ListItem Value="0" Text="No" onclick="alert('TEST2');" /> 

IntelliSense no muestra la propiedad onclick (o se llama atributo?) De la ListItem, pero funciona seguro. ¿Por qué no se muestra? ¿O estoy confiando demasiado en Intellisense? :-) ¿O debería estar declarando esto en código subyacente?

Respuesta

2

El problema es que intellisense para los controles del servidor web no muestra eventos del lado del cliente y solo enumera los eventos que se generan en el servidor. Si tuviera que usar un control de servidor HTML para el mismo propósito, vería los eventos (del lado del cliente JS) en Intellisense.

Otro problema a tener en cuenta es que el evento onclick no es compatible con los elementos de opción (al menos no en IE, aunque Firefox lo admite). En su lugar, debe manejar el evento de cliente onchange. Un ejemplo:

<select id="htmlserverselect" runat="server" onchange="alert(this.value);"> 
    <option value="1">Yes</option> 
    <option value="2">No</option> 
</select> 
+0

¿Es eso necesariamente cierto? Anoté en mi respuesta que el intellisense del botón ASP tiene el onClientClick mostrado. Ese evento no se plantea en el servidor? ¿Estoy confundido acerca de eso tal vez? – TheTXI

+0

Sí, eso sería cierto, porque OnClientClick es una "propiedad del lado del servidor" (¡cualquiera que sea!) Que asegura que el control se representa con el atributo onclick establecido en el valor especificado. Es una medida de conveniencia disponible para un control de servidor web especial, simplemente porque los botones más a menudo requieren algún código de cliente para ejecutarse antes del envío del formulario. – Cerebrus

+0

Eso tiene sentido entonces.Cuando dijo que solo enumera los eventos que se generaron en el servidor que no parecían del todo correctos, OnClientClick no se ejecuta realmente en el servidor. – TheTXI

2

Depende muchas veces del control con el que está trabajando y del atributo. Sé que los controles ASP button mostrarán los atributos onclick y onclientclick en intellisense. Puede ser que ASP.NET no apoyar plenamente el atributo onClick para la listitem (en contraposición a decir el atributo selectedindexchanged en los controles listbox/dropdownlist/etc)

+0

Hmmm ... así que no debería usarlos? Lo probé y funciona, pero si me encuentro con resultados inesperados en el futuro no quiero meterme con eso. Me encanta trabajar con ASP.NET, y estoy comenzando a ingresar a Javascript y realmente me da vueltas, pero por alguna razón parece que los dos no juegan tan bien como deberían. –

+0

Debo añadir un descargo de responsabilidad a mi comentario anterior: soy plenamente consciente de que mi propia falta de experiencia podría ser el problema. –

+0

John Saunders lo resumió con una respuesta más autorizada. Si funciona para usted, funcionará para usted, pero yo no recomendaría hacer algo que en realidad no es compatible. – TheTXI

1

La clase ListItem no tiene onclick propiedad.

Parece que ListItem implementa la interfaz IAttributesAccessor, y también tiene una colección Attributes. Esto se documenta como:

Obtiene una colección de nombre de atributo y pares de valores para ListItem que no son directamente compatibles con la clase.

Los atributos que pone en la etiqueta de esta manera se representan cuando se representa el control. Los detalles de esto difieren por control. Experimenté con una página que contiene lo siguiente:

<asp:DropDownList ID="_ddl1" runat="server" > 
    <asp:ListItem Text="Item 1" Value="Item1" onClick="foox();" oncluck="bar(this);" /> 
</asp:DropDownList> 
<asp:ListBox ID="_listBox1" runat="server"> 
    <asp:ListItem Text="Item 1" Value="Item1" onClick="foox();" oncluck="bar(this);" /> 
</asp:ListBox> 
<asp:RadioButtonList ID="_radioList1" runat="server"> 
    <asp:ListItem Text="Item 1" Value="Item1" onClick="foox();" oncluck="bar(this);" /> 
</asp:RadioButtonList> 

En el caso de la DropDownList y ListBox, ambos atributos son prestados en el elemento <Option>. En el caso del RadioButtonList, el atributo onclick se representa en el elemento <input type="radio">, pero el elemento oncluck no reconocido se representa en el elemento <span> que lo contiene.

Tenga en cuenta que el evento oncluck nunca se activa, al parecer.

;-)

+0

Aparentemente el elemento de lista implementa la interfaz IChicken y se vio obligado a implementar el evento "oncluck" :) – TheTXI

+0

"Tenga en cuenta que el evento oncluck nunca se activa, aparentemente" jaja! –

+0

@Dreas Grech: en realidad lo intenté, pero no pasó nada. ;-) –

0

La razón por la que no se ve en intelisense se debe a que "onclick" no es ASP.Net. Se dará cuenta de que si hace lo siguiente:

<asp:ListItem Value="1" Text="Yes" Secret="Yes" onclick="alert('TEST1');" /> 
<asp:ListItem Value="0" Text="No" Secret="No" onclick="alert('TEST2');" /> 

Si nos fijamos en lo que se rindió a html verá el atributo "secreto". Por lo tanto, aunque ASP.Net presentará los atributos que ingrese allí, solo proporcionará intellisense para los atributos ASP.Net.

En cuanto a las prácticas de codificación, he visto y utilizado el "onclick" demasiadas veces para contar. Entonces, aunque un purista pueda tener un problema con la práctica, creo que está bien usarlo.

0

Asumamos que tenemos un mensaje emergente provocada por una especie de tiempo de espera de sesión del evento.

Como debería tener para su aplicación web de banca en línea .

Por lo tanto, aparece el mensaje que dice que tiene pocos minutos más para completar su experiencia en línea con ese sitio web específico seguro .

Normalmente, si no hace nada al respecto, en el casi al mismo tiempo que tardó en aparecer el mensaje, la aplicación se cerrará .

En el lado del cliente tiene JavaScript para sincronizar esas acciones.

Ahora, supongamos que el botón que cierra la sesión es llamado "btnSignOut".

Si desea activar la misma acción de una línea de JS , el tiempo de espera, debe tener algo como esto:

if(timeout){ 
; 
} 

que activará el mismo evento que haciendo clic en el "btnSignOut" linkButton.

Source

Cuestiones relacionadas