2009-11-11 5 views
2

:asp: DropDownList - postback invalide ou un argument de rappel lors de l'ajout d'options J'ai deux listes déroulantes via JavaScript/JQuery

<asp:DropDownList ID="Field_Type" runat="server" /> 
<asp:DropDownList ID="Field_SubType" runat="server" /> 

Field_Type est-databound, une liste de types, peuplée d'une base de données. Field_SubType est défini via jQuery/AJAX lorsque Field_Type est modifié. J'ajoute ensuite une option en utilisant $("#<%# Field_SubType.ClientID %>").append("<option value=\"1\">Test</option>");. Cela fonctionne comme prévu (je vois le nouveau sous-type ajouté).

Cependant, lors de la publication de retour après avoir sélectionné l'option qui a été ajoutée je reçois une erreur:

Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Quelle pourrait être la cause de cela, et comment pourrais-je travailler autour d'elle? Quelques idées que je:

  1. Utilisez un <select> simple et utiliser Request.Form - pourrait être un problème si elle est dans un contrôle utilisateur utilisé plusieurs fois sur une page
  2. Populate Field_SubType avec tous les sous-types, filtrer les qui ne sont pas un sous-type de Field_Type - cela va charger plus de données que nécessaire, ce qui va ajouter au temps de chargement de la page

D'autres options?

Répondre

3

La cause en est que, par défaut, ASP.NET vérifie que les valeurs soumises dans chaque champ de formulaire sont celles qu'il a envoyées à la page à l'origine. Voici un exemple:

Nous avons un DropDownList avec 3 options - A, B et C. ASP.NET le sait parce que nous les avons ajoutés à partir du code ASP.NET. En JavaScript, nous ajoutons une quatrième option, D. ASP.NET ne sait pas à propos de celui-là car il est arrivé du côté client. Lorsque nous allons soumettre la page, si D est sélectionné, ASP.NET dit "D n'est pas l'un des choix que je vous ai donné, vous pouvez malicieusement essayer de manipuler les valeurs de post dans la requête." Il protège le système et le développeur en abandonnant la requête là.

Vous pouvez tout simplement désactiver la page de validation - sur la page en question, le message d'erreur indique, ou pour toutes les pages au niveau web.config:

<system.web> 
    <pages enableEventValidation="false"/> 
</system.web> 

La validation d'événement est pas toujours nécessaire si vous écrivez votre code de manière à ne jamais prendre d'action explicite directement en fonction des valeurs qui vous sont soumises dans le formulaire (ce que vous ne devriez jamais faire de toute façon). Les valeurs inattendues ou hors de portée de l'utilisateur doivent être ignorées ou vous empêcher de faire quoi que ce soit. Tant que vous écrivez votre code de cette façon, vous pouvez désactiver la validation d'événement en toute sécurité.

+0

Rex, ne serait-ce laisser ouvert à l'injection de script tout le site? Je voudrais juste l'activer sur les pages où le contrôle est utilisé et fournir une validation supplémentaire pour toutes les autres entrées sur la page. –

+1

@Jim en supposant que vous comptez sur cela pour empêcher les utilisateurs de soumettre le balisage, il pourrait. Mais qui fait cela?) –

+0

@Jim Si vous ne comptez que sur la validation de la page pour empêcher XSS, vous avez un autre problème entièrement.Utilisez la dernière version de la bibliothèque AntiXSS pour atteindre un meilleur niveau de sécurité et exécuter CAT.NET pour découvrir les vulnérabilités possibles. –

2

Cela peut également se produire si vous chargez votre liste déroulante avec du texte qui n'a pas été réduit. J'ai chargé une liste déroulante à partir de XML et il a placé des caractères et des espaces newline dans les éléments. Cependant, lorsque la liste déroulante est apparue tout semblait bien. En changeant une liste déroulante j'ai eu l'erreur.

Ajout assiette a résolu le problème:

items.Add(item2.Value.Trim()); 
Questions connexes