Argument de publication ou de rappel non valide. La validation des événements est activée à l'aide de '<pages enableEventValidation = "true" />'

238

J'obtiens l'erreur suivante lorsque je publie une page du côté client. J'ai du code JavaScript qui modifie un asp: ListBox côté client.

Comment réparons nous ça?

Détails de l'erreur ci-dessous:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> 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.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> 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.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> 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.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433
Julius A
la source
N'effectuez pas de liaison de données dans l'événement page_load.
Paul Zahra

Réponses:

171

Le problème est qu'ASP.NET ne parvient pas à connaître cet élément de liste supplémentaire ou supprimé. Vous disposez d'un certain nombre d'options (répertoriées ci-dessous):

  • Désactivez la validation des événements (mauvaise idée, car vous perdez un peu de sécurité qui coûte très peu).
  • Utilisez ASP.NET Ajax UpdatePanel. (Placez la zone de liste dans le panneau de mise à jour et déclenchez une mise à jour, si vous ajoutez ou supprimez une zone de liste. De cette façon, viewstate et les champs connexes obtiennent des mises à jour et la validation des événements passera.)
  • Oubliez le côté client et utilisez la publication classique et ajoutez ou supprimez les listitems côté serveur.

J'espère que ça aide.

Norbert B.
la source
Une autre option: implémentez IPostBackEventHandler et appelez js __doPostBack ('<% = UniqueId.ToString ()%>', arg)
gdbdable
Sur la base des suggestions ci-dessus, j'ai mis mes listes déroulantes dans un asp ASP.NET normal: UpdatePanel, chargé les listes déroulantes dans le code derrière, puis upNewRecord.Update ();
Ricardo Appleton
183

Avez-vous des codes dans vos événements si oui, alors peut-être qu'en ajoutant ce qui suit vous aidera.

if (!Page.IsPostBack)
{ //do something }

Cette erreur est renvoyée lorsque vous cliquez sur votre commande et que la procédure de téléchargement est à nouveau exécutée. Dans un cycle de vie normal, il y a lieu de charger -> Cliquez sur Commande -> (de nouveau) -> Événement Process ItemCommand

Jeff Pang
la source
7
aha! Merci beaucoup, c'était l'astuce dans mon cas! J'ai rechargé une liste déroulante dans le pageload, et donc le framework a perdu le contrôle des éléments (les nouveaux) dans le ddl, et celui sur lequel j'ai cliqué (qui n'existait plus)
Michel
J'ai eu la même erreur que l'OP ... J'utilisais un assistant dans mon formulaire et j'appelais l'étape 0 dans mon chargement de page. supprimé cela et le problème a disparu. Merci ...
Tking
Merci beaucoup pour cette réponse .... J'ai eu le même problème et il s'est avéré que j'avais juste oublié d'ignorer les publications lors du chargement des données dans ma grille ... économisez-moi beaucoup de temps
Quagmire
10
Duh! Revenir aux formulaires Web de MVC est une douleur. C'est la bonne réponse
Vishnoo Rath
2
J'ai fait cela, mais cela n'a pas fonctionné pour moi car il y a du code que je dois exécuter dans l'événement page_load pour quand ce n'est pas une publication, et j'ai donc toujours la même erreur. La désactivation de l'état d'affichage de mon répéteur a résolu le problème à la place.
Bryan
40

J'ai eu une expérience avec DataGrid. L'une de ses colonnes était le bouton "Sélectionner". Lorsque je cliquais sur le bouton "Sélectionner" d'une ligne, j'avais reçu ce message d'erreur:

"Argument de publication ou de rappel non valide. La validation d'événement est activée à l'aide de la configuration ou de <% @ Page EnableEventValidation =" true "%> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie que les arguments des événements de publication ou de rappel proviennent du contrôle serveur qui les ont initialement rendus. Si les données sont valides et attendues, utilisez la méthode ClientScriptManager.RegisterForEventValidation afin d'enregistrer les données de publication ou de rappel pour validation. "

J'ai changé plusieurs codes et j'ai finalement réussi. Mon parcours d'expérience:

1) J'ai changé l'attribut de page en EnableEventValidation="false". Mais ça n'a pas marché. (ce n'est pas seulement dangereux pour des raisons de sécurité, mon gestionnaire d'événements n'a pas été appelé:void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) J'ai implémenté la ClientScript.RegisterForEventValidationméthode Render. Mais ça n'a pas marché.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3) J'ai changé mon type de bouton dans la colonne de la grille de PushButtonà LinkButton. Ça a marché! ("ButtonType =" LinkButton "). Je pense que si vous pouvez changer votre bouton pour d'autres contrôles comme" LinkButton "dans d'autres cas, cela fonctionnerait correctement.

Amir Chatrbahr
la source
1
Ma solution était d'abandonner les boutons d'imbrication dans la grille de données. MS me manque encore une fois.
Jacobs Data Solutions
Votre solution fonctionne aussi pour moi. Je vous remercie. Mais je veux savoir pourquoi Buttonne fonctionne pas quand linkButtontravaille au même programme. Si oui, devons-nous toujours utiliser linkButton? Comment pourrions-nous rendre plus flexible?
Frank Myat jeu
8
Essayez d'ajouter à votre bouton UseSubmitBehavior = "False" stackoverflow.com/questions/2968525/…
JJschk
Awesomeeeeeee :) .. Vous ne pouvez l'apprendre que par expérience .. Vous avez prouvé de véritables spectacles de scènes. L'expérience est le meilleur professeur.
saun4frsh
Dans le remplacement de Render, VOUS DEVEZ METTRE base.Render (writer); à la fin ... sinon ça ne marchera pas!
Paul Zahra
28

Vous allez vraiment vouloir faire 2 ou 3, ne désactivez pas la validation des événements.

Il y a deux problèmes principaux avec l'ajout d'éléments à un asp: côté client listbox.

  • Le premier est qu'il interfère avec la validation des événements. Ce qui est revenu au serveur n'est pas ce qu'il a envoyé.

  • La seconde est que même si vous désactivez la validation des événements, lorsque votre page sera publiée, les éléments de la zone de liste seront reconstruits à partir de l'état d'affichage, de sorte que toutes les modifications apportées au client seront perdues. La raison en est qu'un asp.net ne s'attend pas à ce que le contenu d'une listbox soit modifié sur le client, il s'attend uniquement à ce qu'une sélection soit effectuée, il rejette donc toutes les modifications que vous pourriez avoir apportées.

La meilleure option est la plus susceptible d'utiliser un panneau de mise à jour comme cela a été recommandé. Une autre option, si vous avez vraiment besoin de faire cela côté client, est d'utiliser un ancien simple <select>au lieu d'un <asp:ListBox>, et de conserver votre liste d'éléments dans un champ caché. Lorsque la page s'affiche sur le client, vous pouvez la remplir à partir d'une fraction du contenu de votre champ de texte.

Ensuite, lorsque vous êtes prêt à le publier, vous remplissez à nouveau le contenu du champ masqué à partir de votre modification <select>. Ensuite, bien sûr, vous devez le fractionner à nouveau sur le serveur et faire quelque chose avec vos éléments, car votre sélection est vide maintenant qu'elle est de retour sur le serveur.

Dans l'ensemble, c'est une solution assez lourde que je ne recommanderais pas vraiment, mais si vous devez vraiment faire des modifications côté client d'une listBox, cela fonctionne. Cependant, je vous recommande vraiment de regarder dans un updatePanel avant de suivre cette voie.

Andy C.
la source
3
c, vous n'avez pas besoin de conserver les éléments sélectionnés dans un champ masqué, si vous activez la case de sélection runat = "server", vous pouvez lire la valeur renvoyée dans Request.Form [ selectid .UnqiueID]. Et si plusieurs sont sélectionnés, le navigateur affiche les valeurs en tant que csv. Notez que les éléments et les propriétés d'index sélectionnées du contrôle seront incorrects sur le serveur puisque vous avez modifié l'itrmlist sur le client que le serveur ne connaît pas.
Michael
Michael, ça a marché. tant que vous ajoutez "multiple = true" sinon cela ne vous donnera qu'une valeur. Merci
Sameer Alibhai
1
A eu le même problème pour une liste déroulante avec des caractères de nouvelle ligne. Le passage à une sélection a parfaitement fonctionné. Merci!
thchaver
J'ai utilisé du vieux simple <select>, ce qui a résolu le problème. Pouvez-vous me dire pourquoi Updatepanel prend beaucoup de temps pour charger des données par rapport au chargement de données ajax côté client.?
Pranesh Janarthanan
17

J'ai eu le même problème avec un répéteur parce que j'avais une page Web avec un contrôle de répéteur dans un site Web sur lequel EnableEventValidation était activé. Ce n'était pas bon. J'obtenais des exceptions liées à la publication non valides.

Ce qui a fonctionné pour moi a été de définir EnableViewState = "false" pour le répéteur. Les avantages sont qu'il est plus simple à utiliser, aussi simple que de désactiver la validation des événements pour le site Web ou la page Web, mais la portée est beaucoup moins importante que de désactiver la validation des événements pour les deux.

Umar Farooq Khawaja
la source
3
J'ai eu exactement ce problème avec un contrôle Web hérité. Notre plateforme Web / CMS (sitecore) a reçu une grosse mise à jour qui a activé la validation des événements (elle était auparavant désactivée! Aïe!). Le contrôle du répéteur affichait des images dans une galerie Web (avec des boutons pour les réorganiser) et à la publication de ces boutons, l'exception se produirait. J'ai désactivé l'état d'affichage sur les répéteurs en utilisant EnableViewState = "false" comme vous l'avez suggéré et bon, cela a fonctionné. Comme d'autres l'ont trouvé, le remplacement de Render () et l'utilisation de ClientScriptManager.RegisterForEventValidation () n'ont pas fonctionné pour moi. MERCI!
Xan
Comme @xan, j'utilise également Sitecore et c'est exactement ce dont j'avais besoin.
wilsjd
Cela a également fonctionné pour moi. Le panneau de mise à jour AJAX aurait également fonctionné, mais il y avait des frais généraux gonflés dont je n'avais pas besoin dans le cas, alors merci Umar Farooq Khawaja.
Bryan
17

Rien de ce qui précède n'a fonctionné pour moi. Après avoir creusé davantage, j'ai réalisé que j'avais oublié 2 formulaires appliqués sur la page qui causait le problème.

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

Sachez que récemment ASP.NET a commencé à considérer les iframes dans une balise de formulaire qui contient une balise de formulaire dans le document iframe lui-même un cadre imbriqué. J'ai dû déplacer l'iframe hors de la balise de formulaire pour éviter cette erreur.

biggles
la source
12

J'ai eu le même problème lors de la modification d'un ListBox en utilisant JavaScript sur le client. Cela se produit lorsque vous ajoutez de nouveaux éléments à la ListBox à partir du client qui n'étaient pas là lorsque la page a été rendue.

Le correctif que j'ai trouvé consiste à informer le système de validation des événements de tous les éléments valides possibles qui peuvent être ajoutés à partir du client. Pour ce faire, vous remplacez Page.Render et appelez Page.ClientScript.RegisterForEventValidation pour chaque valeur que votre JavaScript pourrait ajouter à la zone de liste:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

Cela peut être une sorte de problème si vous avez un grand nombre de valeurs potentiellement valides pour la zone de liste. Dans mon cas, je déplaçais des éléments entre deux ListBox - une contenant toutes les valeurs possibles et une autre initialement vide mais remplie avec un sous-ensemble des valeurs de la première en JavaScript lorsque l'utilisateur clique sur un bouton. Dans ce cas, il vous suffit de parcourir les éléments du premier ListBox et de les enregistrer chacun avec la deuxième zone de liste:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}
Josh
la source
9

Une autre façon non mentionnée ici est de sous-classer ListBox

C'est à dire.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation désactive l'attribut System.Web.UI.SupportsEventValidation si vous le sous-classe, à moins que vous ne le rajoutiez explicitement, il n'appellera jamais la routine de validation. Cela fonctionne avec n'importe quel contrôle, et c'est le seul moyen que j'ai trouvé pour le "désactiver" sur une base de contrôle par contrôle (c'est-à-dire, pas au niveau de la page).

Mike C.
la source
2
Joliment décrit ici .
Pavel Hodek
1
Je pense que la meilleure façon de répondre est de le faire. Nous devrions le corriger au niveau du contrôle plutôt qu'au niveau de la page et risquer la sécurité de tous les contrôles impliqués +1 et merci à @PavelHodek pour ce lien.
James Poulose
Malheureusement, il semble que si vous procédez ainsi, tous les éléments de la liste ajoutés sur le client ne seront pas reconnus s'ils sont des éléments sélectionnés lors de la publication de la page.
Jonathan Wood
9

vous essayez quelque chose comme ça, dans votre page .aspx

ajouter

EnableEventValidation = "false"

vous vous sentez libre de poser n'importe quelle question!

user3690871
la source
Je dirais que la désactivation de l'offre de validation intégrée par le framework afin de ne plus voir d'erreur serait la solution la plus appropriée dans ce cas.
Jviaches
8

Si vous remplissez le DropdownList via le script côté client, effacez la liste avant de renvoyer le formulaire au serveur; ASP.NET ne se plaindra pas et la sécurité sera toujours activée.

Et pour obtenir les données sélectionnées dans la DDL, vous pouvez attacher un événement "OnChange" à la DDL pour collecter la valeur dans une entrée masquée ou dans une zone de texte avec Style = "display: none;"

MyEname
la source
+1 Facile à mettre en œuvre. Ce n'est peut-être pas le plus propre, mais assez facile.
nutsch
7

3: J'ai changé mon type de bouton dans la colonne de la grille de "PushButton" à "LinkButton". Ça a marché! ("ButtonType =" LinkButton ") Je pense que si vous pouvez changer votre bouton pour d'autres contrôles comme" LinkButton "dans d'autres cas, cela fonctionnerait correctement.

J'aimerais pouvoir vous voter, Amir (hélas, mon représentant est trop faible). J'avais juste ce problème et changer cela fonctionnait comme un champion sur ma grille. Juste un peu à part, je pense que le code valide est: ButtonType = "Link"

Je soupçonne que cela est dû au fait que lorsque vous cliquez sur «modifier», votre modification passe à «mettre à jour» et «annuler», qui redeviennent ensuite «modifier» lors de la soumission. Et ces commandes changeantes rendent .net mal à l'aise.

Brian Welch
la source
Le nœud de ce problème est le modèle de validation d'événement asp.net et si la «page» est modifiée par le client au moment où vous effectuez une publication. Que voulez-vous dire '..... Et ces commandes de changement rendent .net mal à l'aise' ??
Julius A
7

(1) EnableEventValidation = "false" ................... Cela ne fonctionne pas pour moi.

(2) ClientScript.RegisterForEventValidation .... Cela ne fonctionne pas pour moi.

Solution 1:

Remplacez Button / ImageButton par LinkButton dans GridView. Ça marche. (Mais j'aime ImageButton)

Recherche: Button / ImageButton et LinkButton utilisent différentes méthodes pour publier

Article original:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

Solution 2:

Dans OnInit (), entrez le code quelque chose comme ceci pour définir un ID unique pour Button / ImageButton:

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

Article original:

http://www.c-sharpcorner.com/Forums/Thread/35301/

yilee
la source
6

J'ai implémenté une vue de grille imbriquée et j'ai rencontré le même problème. J'ai utilisé LinkButton au lieu du bouton d'image comme ceci:

avant d'avoir une colonne comme celle-ci:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

J'ai remplacé comme ça.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 
Swathi
la source
5

J'ai eu un problème similaire, mais je n'utilisais pas ASP.Net 1.1 ni ne mettais à jour un contrôle via javascript. Mon problème ne s'est produit que sur Firefox et non sur IE (!).

J'ai ajouté des options à une DropDownList sur l'événement PreRender comme ceci:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

Mon "HF" (champ caché) avait les options séparées par la nouvelle ligne, comme ceci:

HF.value = "option 1\n\roption 2\n\roption 3";

Le problème était que la page HTML était cassée (je veux dire qu'il y avait des nouvelles lignes) sur les options du "select" qui représentaient le DropDown.

J'ai donc résolu mon problème en ajoutant une ligne:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

J'espère que cela aidera quelqu'un.

pamelo
la source
4

si vous passez UseSubmitBehavior="True" à UseSubmitBehavior="False"votre problème sera résolu

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
Ali joodie
la source
Ça n'a pas marché pour moi. J'utilise un bouton d'image cependant, et dans une table dans un répéteur, donc ce n'est pas exactement la même situation. La désactivation de l'état de vue du répéteur a fonctionné pour moi.
Bryan
3

J'ai eu le même problème, ce que j'ai fait:

Je viens d'ajouter une condition if(!IsPostBack)et cela fonctionne bien :)

Niket
la source
3

Cette erreur s'affichera sans postback

Ajouter du code:

If(!IsPostBack){

 //do something

}
Balaji Selvarajan
la source
2

Dans ce cas, ajoutez id au bouton dans RowDataBound de la grille. Cela résoudra votre problème.

nilesh
la source
2

Une solution simple à ce problème consiste à utiliser la vérification IsPostBack lors du chargement de votre page. Cela résoudra ce problème.

utilisateur249527
la source
2

Ajax UpdatePanel le fait, et je pense que c'est le moyen le plus simple, en ignorant les frais généraux de publication Ajax .

netseng
la source
2

Je sais que c'est un post super ancien. En supposant que vous appelez dans votre candidature, voici une idée qui a fonctionné pour moi:

  1. Implémentez ICallbackEventHandler sur votre page
  2. Appelez ClientScriptManager.GetCallbackEventReference pour appeler votre code côté serveur
  3. Comme l'indique le message d'erreur, vous pouvez ensuite appeler ClientScriptManager.RegisterForEventValidation

Si vous n'avez pas besoin d'un contrôle total, vous pouvez utiliser un panneau de mise à jour qui le fera pour vous.

tmck2
la source
2

Nous avons rencontré ce même problème lors de la conversion de nos pages ASPX régulières en pages de contenu.

La page avec ce problème avait une </form>balise dans l'une des sections Contenu, donc deux balises de fin de formulaire ont été rendues au moment de l'exécution, ce qui a provoqué ce problème. La suppression de la balise de fin de formulaire supplémentaire de la page a résolu ce problème.

Tushar
la source
Merci, il s'avère que j'avais aussi des <form>champs supplémentaires dans mon code.
Eric Kigathi
2

Si vous utilisez gridview et ne liez pas gridview à pageload inside! Ispostback, cette erreur se produit lorsque vous cliquez sur modifier et supprimer une ligne dans gridview.

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        bindGridview();
        }
Akhil Singh
la source
1

Il y a quatre minutes, j'ai reçu la même erreur. Ensuite, j'ai fait des recherches pendant une demi-heure comme vous. Dans tous les forums, ils disent généralement "ajouter une page enableEvent .. = false ou true". Toute solution proposée n'a pas résolu mes problèmes jusqu'à ce que je la trouve. Le problème est malheureusement un bouton ASP.NET. Je l'ai retiré il y a deux secondes. J'ai essayé de le remplacer par "imagebutton", mais c'était aussi inacceptable (car il donnait la même erreur).

Enfin, je l'ai remplacé par LinkButton. ça semble marcher!

cem
la source
1

J'utilisais la base de données et j'obtenais la même erreur pour mon bouton-poussoir. J'utilise simplement IsPostBack pour vérifier et remplir mes contrôles et le problème est résolu! Génial!!!

Razia
la source
1

Ce qui a fonctionné pour moi, c'est de déplacer le code suivant de page_load vers page_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}
Murad Dodhiya
la source
1

La meilleure option à faire est d'utiliser un champ caché et de ne pas désactiver la validation des événements, modifiez également chaque zone de liste, liste déroulante pour sélectionner avec l'attribut du serveur runat

Programista
la source
Passer du contrôle asp à un <select id = "director" runat = "server"> normal a très bien fonctionné. J'ai pu accéder à sa valeur dans le code derrière en utilisant: ex .: string directorId = Request.Form [director.ID]
Baxter
1

Si vous utilisez le panneau de mise à jour Ajax. Ajouter une <Triggers>balise et à l'intérieur, déclencher le bouton ou le contrôle provoquant le postBack en utilisant<asp:PostBackTrigger .../>

devo882
la source
1

Si vous connaissez à l'avance les données qui pourraient être remplies, vous pouvez utiliser ClientScriptManager pour résoudre ce problème. J'ai eu ce problème lors du remplissage dynamique d'une liste déroulante à l'aide de javascript sur une sélection d'utilisateurs précédente.

Voici un exemple de code pour remplacer la méthode de rendu (en VB et C #) et déclarer une valeur potentielle pour la liste déroulante ddCar.

En VB:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

ou une légère variation de C # pourrait être:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

Pour les débutants: Cela devrait aller dans le code derrière le fichier (.vb ou .cs) ou s'il est utilisé dans le fichier aspx, vous pouvez envelopper dans les <script>balises.

CraigS
la source
1

C'était la raison pour laquelle je l'obtenais:

J'avais un ASP: ListBox. Au départ, c'était caché. Côté client, je le remplirais via AJAX avec des options. L'utilisateur a choisi une option. Ensuite, en cliquant sur le bouton Soumettre, le serveur se moquait de la ListBox, car il ne se souvenait pas qu'il avait des options.

J'ai donc vérifié toutes les options de la liste avant de renvoyer le formulaire au serveur. De cette façon, le serveur ne s'est pas plaint car la liste est allée au client vide et elle est revenue vide.

Trié !!!

user2520440
la source