2009-04-25 11 views
5

Je suis juste dans plus de choses côté client dans ASP.NET en utilisant Javascript, et il y a quelque chose qui me tracasse que nous espérons que quelqu'un peut expliquer. Pourquoi est-ce que intellisense ne montre pas tous les attributs/propriétés d'un contrôle .NET? Par exemple, un ListItem dans un RadioButtonListControl:ASP.NET IntelliSense par rapport Attributs côté client

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

IntelliSense ne montre pas la propriété onclick (ou est-il appelé attribut?) De la ListItem, mais il est certain des œuvres. Pourquoi ça ne se voit pas? Ou est-ce que je compte trop sur Intellisense? :-) Ou devrais-je déclarer ce genre de choses en code-behind?

Répondre

2

Le problème est que IntelliSense pour les contrôles de serveur Web n'affiche pas les événements côté client et ne liste que les événements qui sont soulevées sur le serveur. Si vous deviez utiliser un contrôle serveur HTML dans le même but, vous verriez les événements (côté client JS) dans Intellisense.

Un autre problème à prendre en compte est que l'événement onclick n'est pas pris en charge pour les éléments d'option (au moins pas dans IE, bien que Firefox le supporte bien). Vous devriez plutôt gérer l'événement côté client onchange. Un exemple:

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

Est-ce nécessairement vrai? J'ai noté dans ma réponse que l'intellisense du bouton ASP affichait onClientClick. Cet événement n'est pas déclenché sur le serveur? Suis-je confus à ce sujet peut-être? – TheTXI

+0

Oui, ce serait vrai, car OnClientClick est une "propriété côté serveur" (quelle qu'elle soit!) Qui s'assure que le contrôle est rendu avec l'attribut onclick défini à la valeur spécifiée. C'est une mesure de commodité disponible pour un contrôle de serveur Web spécial, tout simplement parce que les boutons requièrent le plus souvent du code client pour s'exécuter avant la soumission du formulaire. – Cerebrus

+0

Cela a du sens alors.Quand vous avez dit qu'il ne liste que les événements qui sont levés sur le serveur, cela n'a pas semblé tout à fait correct puisque OnClientClick ne fonctionne pas réellement sur le serveur. – TheTXI

2

Cela dépend beaucoup de fois du contrôle que vous utilisez et de l'attribut. Je sais que les contrôles ASP button afficheront les attributs onclick et onclientclick dans IntelliSense. Il se peut que ASP.NET ne supporte pas complètement l'attribut onClick pour la listitem (par opposition à dire l'attribut selectedindexchanged sur les listbox/dropdownlist/etc contrôles)

+0

Hmmm ... donc je ne devrais pas les utiliser? Je l'ai testé et cela fonctionne, mais si je peux rencontrer des résultats inattendus dans le futur, je ne veux pas le faire. J'adore travailler avec ASP.NET, et je commence tout juste à entrer dans Javascript et ça craque vraiment, mais pour une raison quelconque, il semble que les deux ne jouent pas aussi bien qu'ils le devraient. –

+0

Je devrais ajouter un avertissement à mon commentaire ci-dessus: Je suis pleinement conscient que mon propre manque d'expérience pourrait être le problème. –

+0

John Saunders l'a résumé avec une réponse plus autoritaire. Si cela fonctionne pour vous, cela fonctionnera pour vous, mais je ne recommanderais pas de faire quelque chose qui n'est pas réellement pris en charge. – TheTXI

1

La classe ListItem n'a pas de propriété onclick.

Il semble que ListItem implémente l'interface IAttributesAccessor et possède également une collection Attributes. Cela est documenté comme suit:

Obtient une collection de paires de nom d'attribut et de valeur pour le ListItem qui ne sont pas directement pris en charge par la classe.

Les attributs que vous placez sur le tag de cette manière sont restitués lorsque le contrôle est rendu. Les détails de ceci diffèrent par le contrôle. J'ai expérimenté avec une page contenant les éléments suivants:

<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> 

Dans le cas du DropDownList et ListBox, les deux attributs sont rendus sur l'élément <Option>. Dans le cas de la RadioButtonList, l'attribut onclick est rendue sur l'élément <input type="radio">, mais l'élément oncluck non reconnu est rendue sur le enfermant élément <span>.

Notez que l'événement est oncluck n'a jamais tiré, apparemment.

;-)

+0

Apparemment, listitem implémente l'interface IChicken et a été forcé d'implémenter l'événement "oncluck" :) – TheTXI

+0

"Notez que l'événement oncluck n'est jamais déclenché, apparemment" haha! –

+0

@Dreas Grech: J'ai effectivement essayé, mais rien ne s'est passé. ;-) –

0

La raison pour laquelle vous ne voyez pas dans IntelliSense est parce que "onclick" n'est pas ASP.Net. Vous remarquerez que si vous effectuez les opérations suivantes:

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

Si vous regardez ce qui est rendu pour vous html verrez l'attribut « Secret ». Ainsi, alors qu'ASP.Net rendra tous les attributs que vous y mettez, il ne fournira qu'intellisense pour les attributs ASP.Net.

En ce qui concerne les pratiques de codage, je l'ai vu et utilisé les « onclick » trop de fois à compter. Donc, alors qu'un puriste pourrait avoir un problème avec la pratique, je pense qu'il est bon d'utiliser.

0

Supposons que nous avons un message pop-up déclenché par une sorte de délai d'attente de la session événement.

Comme vous devriez l'avoir pour votre application bancaire en ligne .

Ainsi, le message apparaît en lisant que vous avez quelques minutes de plus pour compléter votre expérience en ligne avec ce site Web sécurisé spécifique .

Habituellement, si vous ne faites rien à ce sujet, en à peu près au même moment où il a pris le message pour apparaître, l'application vous déconnectera.

Sur le côté client, vous avez JavaScript pour chronométrer ces actions. Maintenant, disons que le bouton qui vous signe est appelé "btnSignOut".

Si vous souhaitez déclencher la même action d'une ligne de JS, le délai d'attente, vous devriez avoir quelque chose comme ceci:

if(timeout){ 
; 
} 

qui déclenchera le même événement en cliquant sur le "btnSignOut" linkButton.

Source

Questions connexes