2008-10-31 6 views
5

J'ai une page avec quelques boutons ajoutés dynamiquement. Si vous cliquez sur un bouton avant que la page est complètement chargée, il jette l'exception classique:Comment puis-je empêcher les exceptions de la soumission de formulaire de pages à moitié chargées lors de l'utilisation de la validation d'événement asp.net?

Invalid postback or callback argument. 
Event validation is enabled using in configuration or 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.

Je devine que le champ Viewstate n'a pas chargé sur la forme encore, les autres bits sont soumis. Quelle est la meilleure façon d'éviter cette erreur, tout en conservant la validation des événements?

Répondre

4

J'ai répondu à une question similaire here. Pour citer:

Essentiellement, vous voulez obtenir le ViewState pour charger en haut de la page. Dans .NET 3.5 SP1, la propriété RenderAllHiddenFieldsAtTopOfForm a été ajoutée à la configuration PagesSection.

Web.config

<configuration> 

    <system.web> 

     <pages renderAllHiddenFieldsAtTopOfForm="true"></pages> 

    </system.web> 

</configuration> 

Fait intéressant, la valeur par défaut de cela est vrai. Ainsi, si vous utilisez .NET 3.5 SP1, le ViewState est automatiquement affiché en haut du formulaire (avant que le reste de la page ne soit chargé), ce qui élimine l'erreur ViewState que vous recevez.

+0

valeur par défaut est "true", voir http://goo.gl/jHr8 sur MSDN – craigmoliver

0

si vous définissez false la propriété visible de ceux bouton par défaut et à la fin de la validation de chargement de la page ou si vous définissez leur propriété visible sur true? Cela les empêche de cliquer sur le bouton jusqu'à ce que la page soit complètement chargée.

0

D'après ce que je peux dire le ViewState est chargé juste après l'étiquette de formulaire sur la page.

Avez-vous essayé d'utiliser ClientScriptManager.RegisterForEventValidation(button.UniqueID) pour chaque bouton après avoir ajouté le bouton à la page? Selon l'endroit où vous ajoutez le bouton, le lien d'événement pour la page peut déjà avoir eu lieu et ainsi les événements générés par le bouton peuvent ne pas être enregistrés avec la page.

+0

Je parie qu'ils doivent être déclarés dans Page_Init ... – Shawn

2

J'ai trouvé cela être plus souvent par le champ __EVENTVALIDATION que le ViewState pas chargé. Le __EVENTVALIDATION est en bas de la page et s'il n'a pas été reçu par le client lorsque l'utilisateur provoque une publication, vous obtiendrez cette exception.

Je n'ai pas encore trouvé une bonne solution, mais ce que je fais habituellement sur les pages qui ont tendance à causer cela en raison d'une grande quantité de contenu est de câbler les boutons à une fonction javascript qui vérifie une variable isLoaded défini sur true dans l'appel document.ready. Si isLoaded est faux, il mange silencieusement l'événement, s'il est vrai, il le laisse passer. C'est une douleur à mettre en place, mais il a mis fin à la plupart de mes problèmes de publication invalide.

+0

vous avez raison, c'est le champ de validation d'événement. ceci est fixé en 3.5 apparemment. – Shawn

0

J'ai passé assez de temps à essayer de comprendre pourquoi la balise __EVENTVALIDATION rend au fond sur un site particulier, mais vers le haut sur tout autre site Web. J'ai finalement compris que c'était à cause du code dans l'événement de substitution Render.Cela, avec un viewstate maigre surtout se sont débarrassés de cette erreur, mais juste pour faire bonne mesure, j'ajouté la logique ci-dessous sur le bouton qui a été à l'origine de l'erreur:

javascript quelque part sur la page

function CheckForHiddenFields() 
{ 
    var EventValidation = document.getElementById('__EVENTVALIDATION'); 
    if (EventValidation && EventValidation.value && EventValidation.value != '') 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Ajouter attribut à asp: Button:

OnClientClick="return CheckForHiddenFields();" 
Questions connexes