Estou recebendo o seguinte erro ao postar de volta uma página do lado do cliente. Eu tenho o código JavaScript que modifica um asp: ListBox no lado do cliente.
Como nós consertamos isso?
Detalhes do erro abaixo:
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
Respostas:
O problema é que o ASP.NET não conhece esse item de lista extra ou removido. Você tem várias opções (listadas abaixo):
Eu espero que isso ajude.
fonte
Você tem códigos nos seus eventos Page_Load? se sim, talvez adicionando o seguinte ajude.
Este erro é gerado quando você clica no seu comando e o Page_load está sendo executado novamente, em um ciclo de vida normal será Page_Load -> Clique em Comando -> Page_Load (novamente) -> Processar ItemCommand Event
fonte
Eu tive uma experiência com o DataGrid. Uma de suas colunas era o botão "Selecionar". Quando eu estava clicando no botão "Selecionar" de qualquer linha, recebi esta mensagem de erro:
Mudei vários códigos e finalmente consegui. Rota da minha experiência:
1) Alterei o atributo da página para
EnableEventValidation="false"
. Mas não deu certo. (isso não é apenas perigoso por motivos de segurança, meu manipulador de eventos não foi chamado:void Grid_SelectedIndexChanged(object sender, EventArgs e)
2) Eu implementei
ClientScript.RegisterForEventValidation
no método Render. Mas não deu certo.3) Alterei o tipo de botão na coluna da grade de
PushButton
paraLinkButton
.Funcionou! ("ButtonType =" LinkButton "). Acho que se você puder alterar o botão para outros controles como" LinkButton "em outros casos, funcionaria corretamente.fonte
Button
não está funcionando quandolinkButton
está trabalhando no mesmo programa. Em caso afirmativo, devemos sempre usarlinkButton
? Como poderíamos tornar mais flexíveis?Você realmente deseja fazer 2 ou 3, não desative a validação de evento.
Existem dois problemas principais ao adicionar itens a um asp: lado do cliente da caixa de listagem.
A primeira é que ela interfere na validação do evento. O que voltou ao servidor não é o que foi enviado.
A segunda é que, mesmo que você desative a validação de eventos, quando sua página for postada novamente, os itens na caixa de listagem serão reconstruídos a partir do estado de exibição, para que todas as alterações feitas no cliente sejam perdidas. A razão para isso é que um asp.net não espera que o conteúdo de uma caixa de listagem seja modificado no cliente, espera apenas que uma seleção seja feita, descartando quaisquer alterações que você possa ter feito.
A melhor opção provavelmente usará um painel de atualização, conforme recomendado. Outra opção, se você realmente precisa fazer isso do lado do cliente, é usar uma planície antiga em
<select>
vez de uma<asp:ListBox>
e manter sua lista de itens em um campo oculto. Quando a página é renderizada no cliente, você pode preenchê-la a partir de uma divisão do conteúdo do campo de texto.Então, quando estiver pronto para publicá-lo, você repovoará o conteúdo do campo oculto do seu arquivo modificado.
<select>
. Então, é claro, você deve dividir isso novamente no servidor e fazer algo com seus itens, pois sua seleção está vazia agora que está de volta ao servidor.Em suma, é uma solução bastante complicada que eu realmente não recomendaria, mas se você realmente tiver que fazer modificações no listBox no lado do cliente, funcionará. Eu realmente recomendo que você procure um updatePanel antes de seguir esse caminho.
fonte
<select>
, que resolveu o problema. Você pode me dizer por que o Updatepanel está demorando muito para carregar dados quando comparado ao carregamento de dados ajax do lado do cliente.?Eu tive o mesmo problema com um repetidor porque tinha uma página da Web com um controle Repeater em um site em que EnableEventValidation estava ativado. Não foi bom. Eu estava recebendo exceções relacionadas à postagem inválida.
O que funcionou para mim foi definir EnableViewState = "false" para o Repetidor. As vantagens são que é mais simples de usar, tão simples quanto desativar a validação de eventos para o site ou página da Web, mas o escopo é muito menor do que desativar a validação de eventos para ambos.
fonte
Nenhuma das opções acima funcionou para mim. Depois de mais pesquisas, percebi que havia ignorado dois formulários aplicados na página que estava causando o problema.
Lembre-se de que recentemente o ASP.NET começou a considerar iframes em uma marca de formulário que contém uma marca de formulário no próprio documento iframe como um quadro aninhado. Eu tive que mover o iframe para fora da tag do formulário para evitar esse erro.
fonte
Eu tive o mesmo problema ao modificar um ListBox usando JavaScript no cliente. Isso ocorre quando você adiciona novos itens ao ListBox do cliente que não estavam lá quando a página foi renderizada.
A correção que encontrei é informar o sistema de validação de eventos de todos os possíveis itens válidos que podem ser adicionados a partir do cliente. Você faz isso substituindo Page.Render e chamando Page.ClientScript.RegisterForEventValidation para cada valor que seu JavaScript pode adicionar à caixa de listagem:
Isso pode ser um pouco complicado se você tiver um grande número de valores potencialmente válidos para a caixa de listagem. No meu caso, eu estava movendo itens entre dois ListBoxes - um que possui todos os valores possíveis e outro que está inicialmente vazio, mas é preenchido com um subconjunto dos valores do primeiro em JavaScript quando o usuário clica em um botão. Nesse caso, você só precisa percorrer os itens no primeiro ListBox e registrar cada um com a segunda caixa de listagem:
fonte
Uma outra maneira não mencionada aqui é a subclasse ListBox
Ou seja.
ClientEventValidation retira o atributo System.Web.UI.SupportsEventValidation se você a subclassificar, a menos que você o adicione explicitamente novamente, ele nunca chamará a rotina de validação. Isso funciona com qualquer controle e é a única maneira que encontrei para "desabilitá-lo" em uma base de controle por controle (ou seja, não no nível da página).
fonte
você tenta algo assim, na sua página .aspx
adicionar
sinta-se à vontade para fazer qualquer pergunta!
fonte
Se você preencher o DropdownList através do script do lado do cliente, limpe a lista antes de enviar o formulário de volta ao servidor; o ASP.NET não reclamará e a segurança continuará ativa.
E para obter os dados selecionados no DDL, você pode anexar um evento "OnChange" ao DDL para coletar o valor em uma Entrada oculta ou em uma caixa de texto com Style = "display: none;"
fonte
Eu gostaria de poder votar em você, Amir (infelizmente meu representante é muito baixo.) Eu estava tendo esse problema e mudar isso funcionou como um campeão no meu gridview. Só um pouco de lado, acho que o código válido é: ButtonType = "Link"
Eu suspeito que isso ocorre porque, quando você clica em "editar", sua edição muda para "atualização" e "cancelamento", que são alteradas novamente para "edição" no envio. E esses controles de mudança tornam o .net desconfortável.
fonte
(1) EnableEventValidation = "false" ................... Não funciona para mim.
(2) ClientScript.RegisterForEventValidation .... Não funciona para mim.
Solução 1:
Altere o Button / ImageButton para LinkButton no GridView. Funciona. (Mas eu gosto do ImageButton)
Pesquisa: Button / ImageButton e LinkButton usam métodos diferentes para postback
Artigo original:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
Solução 2:
Em OnInit (), digite o código semelhante a este para definir um ID exclusivo para Button / ImageButton:
Artigo original:
http://www.c-sharpcorner.com/Forums/Thread/35301/
fonte
Eu implementei uma exibição de grade aninhada e enfrentei o mesmo problema. Usei o LinkButton em vez do botão de imagem como este:
antes de eu ter uma coluna como esta:
Eu substituí assim.
fonte
Eu tive um problema semelhante, mas não estava usando o ASP.Net 1.1 nem atualizando um controle via javascript. Meu problema aconteceu apenas no Firefox e não no IE (!).
Adicionei opções a um DropDownList no evento PreRender como este:
Meu "HF" (campo oculto) tinha as opções separadas pela nova linha, assim:
O problema era que a página HTML estava quebrada (quero dizer, tinha novas linhas) nas opções do "select" que representava o DropDown.
Então resolvi meu problema adicionando uma linha:
Espero que isso ajude alguém.
fonte
se você mudar
UseSubmitBehavior="True"
para oUseSubmitBehavior="False"
seu problema será resolvidofonte
Eu tive o mesmo problema, o que fiz:
Acabei de adicionar uma condição
if(!IsPostBack)
e funciona bem :)fonte
Este erro será exibido sem postagem
Adicionar código:
fonte
Nesse caso, adicione o ID ao botão RowDataBound da grade. Isso resolverá o seu problema.
fonte
Uma solução simples para esse problema é usar a verificação IsPostBack no carregamento da página. Isso resolverá esse problema.
fonte
O Ajax UpdatePanel faz isso, e acho que é a maneira mais fácil, ignorando a sobrecarga de postagem do Ajax .
fonte
Eu sei que este é um post super antigo. Supondo que você esteja ligando para o seu aplicativo, aqui está uma ideia que funcionou para mim:
Se você não precisar de controle total, poderá usar um painel de atualização que faria isso por você.
fonte
Encontramos esse mesmo problema quando convertíamos nossas páginas ASPX regulares em páginas de conteúdo.
A página com esse problema tinha uma
</form>
tag em uma das seções Conteúdo, portanto, duas tags de final de formulário foram renderizadas em tempo de execução, o que causou esse problema. A remoção da tag final de formulário extra da página resolveu esse problema.fonte
<form>
campos extras no meu código.Se você estiver usando o gridview e não vincular o gridview ao carregamento de página dentro do! Ispostback, esse erro ocorrerá quando você clicar em editar e excluir a linha no gridview.
fonte
Há quatro minutos, recebi o mesmo erro. Então eu pesquisei durante meia hora como você. Em todos os fóruns, eles geralmente dizem "adicionar página enableEvent .. = false ou true". Qualquer solução proposta não resolveu meus problemas até que eu a encontrasse. Infelizmente, o problema é um botão do ASP.NET. Eu o removi dois segundos atrás. Tentei substituir por "imagebutton", mas também foi inaceitável (porque deu o mesmo erro).
Finalmente eu substituí por
LinkButton
. Parece que está funcionando!fonte
Eu estava usando o datalist e estava recebendo o mesmo erro no meu botão de pressão. Eu apenas uso o IsPostBack para verificar e preencher meus controles e o problema está resolvido! Ótimo!!!
fonte
O que funcionou para mim foi mover o seguinte código de page_load para page_prerender:
fonte
A melhor opção a fazer é usar o campo oculto e não desativar a validação de eventos, também altere todas as caixas de listagem e lista suspensa para selecionar com o atributo do servidor runat
fonte
Se você estiver usando o painel de atualização do Ajax. Adicione a
<Triggers>
tag e dentro dela acione o botão ou controle causando o postBack usando<asp:PostBackTrigger .../>
fonte
Se você souber de antemão os dados que poderiam ser preenchidos, poderá usar o ClientScriptManager para resolver esse problema. Eu tive esse problema ao preencher dinamicamente uma caixa suspensa usando javascript em uma seleção de usuário anterior.
Aqui está um exemplo de código para substituir o método de renderização (em VB e C #) e declarar um valor potencial para o ddCar da lista suspensa.
No VB:
ou uma pequena variação no C # pode ser:
Para iniciantes: isso deve aparecer no código por trás do arquivo (.vb ou .cs) ou, se usado no arquivo aspx, você pode agrupar as
<script>
tags.fonte
Esta foi a razão pela qual eu estava conseguindo:
Eu tinha um ASP: ListBox. Inicialmente estava escondido. No lado do cliente, eu o preencheria via AJAX com opções. O usuário escolheu uma opção. Então, ao clicar no botão Enviar, o servidor ficaria engraçado com o ListBox, pois não se lembrava de ter opções.
Então, o que fiz foi garantir que limpe todas as opções da lista antes de enviar o formulário de volta ao servidor. Dessa forma, o servidor não reclamou, pois a lista foi para o cliente vazia e voltou vazia.
Classificado !!!
fonte