postback inválido ou o argumento de retorno de chamada. a validação do evento está habilitado usando ''

StackOverflow https://stackoverflow.com/questions/228969

Pergunta

Estou recebendo o seguinte erro quando eu enviar 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 é que vamos corrigir 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
Foi útil?

Solução

O problema é que ASP.NET não começar a conhecer esta listitem extra ou removido. Você tem um número de opções (listados abaixo):

  • eventvalidation Disable (má idéia, porque você perde um pouco de segurança que vêm com um custo muito pequeno).
  • Use ASP.NET Ajax UpdatePanel. (Coloque a caixa de listagem na UpdatePanel e desencadear uma atualização, se você adicionar ou remover caixa de listagem. Desta forma viewstate e áreas afins obter atualizações e eventvalidation vai passar.)
  • Esqueça do lado do cliente e usar o postback clássico e adicionar ou remover os listitems do lado do servidor.

Espero que isso ajude.

Outras dicas

Você tem códigos em você page_load eventos? Se sim, então talvez adicionando o seguinte vai ajudar.

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

Este erro é lançada quando você clica em seu comando eo Page_load está sendo correu de novo, em um ciclo de vida normal será Page_Load -> Clique na Command -> Page_Load (novamente) -> Processo ItemCommand Evento

Eu tive uma experiência com DataGrid. Uma de suas colunas era o botão "Select".

: Quando eu estava clicando no botão de qualquer linha que eu tinha recebido esta mensagem de erro "Select"

"postback ou de retorno de chamada argumento inválido validação do evento. Estiver ativada usando na configuração ou <% @ Page EnableEventValidation = "true" %> em uma página. Por motivos de segurança, esse recurso verifica que os argumentos de postback ou eventos de retorno de chamada se originam do controle de servidor que originalmente tornou-os. Se os dados forem válidos e esperados, use o método ClientScriptManager.RegisterForEventValidation a fim de registrar o postback ou de retorno de chamada de dados para validação. "

Eu mudei vários códigos, e finalmente eu consegui. Minha experiência rota:

1) eu mudei atributo página para EnableEventValidation="false". Mas não deu certo. (não só isto é perigoso por motivo de segurança, o 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.

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) Mudei de tipo botão na coluna da grade de PushButton para LinkButton. Funcionou! ( "ButtonType =" LinkButton "). Eu acho que se você pode mudar seu botão para outros controles como "LinkButton" em outros casos, ele iria trabalhar corretamente.

Você está realmente vai querer fazer 2 ou 3, fazer a validação de evento não desativar.

Há dois problemas principais com a adição de itens para um asp:. Lado do cliente caixa de listagem

  • A primeira é que ela interfere com a validação do evento. O que veio de volta para o servidor não é o que enviou para baixo.

  • A segunda é que, mesmo se você a validação do evento desativar, quando a sua página é enviada de volta os itens na caixa de listagem será reconstruído a partir do estado de visualização, por isso todas as alterações feitas no cliente são perdidas. A razão para isto é que um asp.net não espera que o conteúdo de uma caixa de listagem a ser modificado no cliente, ele só espera uma seleção a ser feita, por isso descarta quaisquer alterações que possam ter ocorrido.

A melhor opção é mais propensos a usar um painel de atualização, como tem sido recomendado. Outra opção, se você realmente precisa fazer isso do lado do cliente, é usar um <select> velho liso em vez de um <asp:ListBox>, e para manter a sua lista de itens em um campo escondido. Quando a página é processada no cliente, você pode preenchê-lo a partir de uma cisão de seus conteúdo do campo de texto.

Então, quando você estiver pronto para publicá-la, você repovoar o conteúdo do campo escondido de seu <select> modificado. Então, é claro, você tem que dividir isso de novo no servidor e fazer algo com seus itens, uma vez que a sua escolha está vazia, agora que ele está de volta no servidor.

Tudo em tudo é uma solução complicada bonita que eu realmente não recomendo, mas se você realmente tem que fazer modificações do lado do cliente de uma caixa de listagem, ela não funciona. Eu realmente recomendo que você olhar para um UpdatePanel antes de ir por esse caminho, no entanto.

Eu tive o mesmo problema com um repetidor, porque eu tinha uma página web com um controle Repeater em um web-site que tinha EnableEventValidation ligado. Não era bom. Eu estava ficando exceções relacionadas postback inválido.

O que funcionou para mim foi para definir EnableViewState = "false" para o Repeater. As vantagens são que é mais simples de usar, tão simples quanto mudar a validação do evento off para o web-site ou página da web, mas o escopo é muito menos do que a troca de validação evento fora para qualquer um.

Nenhuma das opções acima funcionou para mim. Depois de mais cavando eu percebi que tinha esquecido 2 formas aplicado na página que estava causando o problema.

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

Esteja ciente de que, recentemente, ASP.NET começou considerando iframe dentro de uma tag de formulário que contém uma tag de formulário no documento iframe si um quadro aninhado. Eu tive que mudar o iframe fora do tag forma de evitar este erro.

Eu tive o mesmo problema ao modificar uma caixa de listagem usando JavaScript no cliente. Ela ocorre quando você adicionar novos itens para o ListBox do cliente que não estavam lá quando a página foi prestado.

A correção que eu achei é 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ê pode fazer isso, substituindo Page.Render e chamando Page.ClientScript.RegisterForEventValidation para cada valor que seu JavaScript poderia adicionar à caixa de lista:

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

Este pode ser um tipo de dor se você tiver um grande número de valores potencialmente válidos para a caixa de lista. No meu caso eu estava movendo itens entre dois ListBoxes - um que que tem todos os valores possíveis e outra que é inicialmente vazio, mas é preenchido com um subconjunto dos valores da primeira em JavaScript quando o usuário clica em um botão. Neste caso, você só precisa percorrer os itens na primeira ListBoxand registrar cada um com a segunda caixa de lista:

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

Uma outra forma não mencionada aqui é a subclasse de caixa de listagem

Ie.

public class ListBoxNoEventValidation : ListBox 
{
}

chaves ClientEventValidation fora do System.Web.UI.SupportsEventValidation atributo se você subclasse-lo, a menos que você adicioná-lo explicitamente de volta, ele nunca vai chamar a rotina de validação. Que funciona com qualquer controle, e é a única maneira que eu encontrei para "desativar"-lo em um controle por base o controle (isto é, não nível de página).

3: eu mudei o meu tipo botão na grade coluna de "PushButton" para "LinkButton". Funcionou! ( "ButtonType =" LinkButton ") Eu acho que se você pode mudar o seu botão para outra controles como "LinkButton" em outra casos, ele iria trabalhar corretamente.

Eu gostaria de poder votar você, Amir (infelizmente meu representante é muito baixo.) Eu estava tendo este problema e mudar isso funcionou como um campeão no meu gridview. Apenas um pouco de lado, eu acho que o código válido é: ButtonType = "Link"

Eu suspeito que isso é porque quando você clicar em 'editar', a sua edição muda para 'update' e 'cancelar', que, em seguida, mudar de volta para 'editar' em enviar. E esses controles deslocando tornar desconfortável .net.

(1) EnableEventValidation = "false" ................... ele não funciona para mim.

(2) ClientScript.RegisterForEventValidation .... ele não funciona para mim.

Solução 1:

botão Alterar / ImageButton para LinkButton no GridView. Funciona. (Mas eu gosto ImageButton)

Research: Botão / ImageButton e LinkButton usar diferentes métodos para postagem

Artigo original:

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

Solução 2:

Em OnInit (), digite o código algo como isto para definir um ID único para 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();           
  }
}

Artigo Original:

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

você tentar algo assim, na sua página aspx

add

EnableEventValidation = "false"

você se sente livre para fazer qualquer pergunta!

Se você preencher o DropDownList através de script do lado do cliente, em seguida, limpar a lista antes de enviar o formulário de volta ao servidor; em seguida, ASP.NET não vai reclamar e a segurança será ainda por diante.

E para obter os dados selecionados a partir do DDL, você pode anexar um evento "OnChange" para o DDL para recolher o valor em uma entrada escondida ou em uma caixa de texto com style = "display: none;"

Eu implementei uma exibição de grade aninhada e i enfrentou o mesmo problema .Eu usei LinkButton em vez de botão de imagem como esta:

Antes eu tinha uma coluna como esta:

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

Eu substituí assim.

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

Eu tive um problema semelhante, mas eu não estava usando ASP.Net 1.1 ou atualizar um controle via javascript. Meu problema só aconteceu no Firefox e não no IE (!).

Eu adicionei opções para um DropDownList no evento PreRender assim:

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

Meu "HF" (HiddenField) teve as opções separadas pela nova linha, como este:

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

O problema era que a página HTML foi quebrado (quero dizer, teve novas linhas) sobre as opções da "escolha" que representavam suspensa.

Então eu resolvi meu problema meu adicionando uma linha:

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

Espero que isso ajuda alguém.

Se você alterar UseSubmitBehavior="True" para UseSubmitBehavior="False" seu problema será resolvido

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

Eu tive o mesmo problema, o que eu fiz:

Apenas acrescentou um if(!IsPostBack) condição e ele funciona muito bem:)

Este erro irá mostrar sem postback

Adicione o código:

If(!IsPostBack){

 //do something

}

Neste caso add id para o botão em RowDataBound da grade. Ele vai resolver seu problema.

Uma solução simples para este problema é usar o IsPostBack controlo sobre o seu carregamento da página. Que irá resolver este problema.

Ajax UpdatePanel faz isso, e eu acho que é o mais fácil forma, ignorando o Ajax postback em cima.

Eu sei que este é um post super-idade. Assumindo que você está chamando para a sua aplicação, aqui está uma ideia que tem trabalhado para mim:

  1. Implementar a ICallbackEventHandler em sua página
  2. Chamada ClientScriptManager.GetCallbackEventReference para chamar o código do lado do servidor
  3. Como os estados de mensagem de erro, você poderia, então, chamar ClientScriptManager.RegisterForEventValidation

Se você não precisa de total controle, você pode usar um painel de atualização que faria isso para você.

Nós corri para este mesmo problema quando estávamos convertendo nossas páginas regulares ASPX para páginas de conteúdo.

A página com esta questão tinha uma etiqueta </form> dentro de uma das seções de conteúdo, assim, duas etiquetas forma finais foram prestados em tempo de execução que causou este problema. Removendo a etiqueta forma final extra a partir da página resolveu esta questão.

Quatro minutos atrás recebi o mesmo erro. Então eu pesquisei durante uma hora e meia como você. Em todos os fóruns são geralmente dizer "página add enableEvent .. = false ou true". Qualquer solução proposta não resolvido meus problemas até que eu encontrei. O problema é, infelizmente, um botão de ASP.NET. Eu o retirei dois segundos atrás. Eu tentei substituir por "imagebutton", mas também era inaceitável (porque ele deu o mesmo erro).

Finalmente eu substituído por LinkButton. ele parece estar funcionando!

Eu estava usando o datalist e eu estava recebendo o mesmo erro para o meu botão. Eu só uso IsPostBack para verificar e encher meus controles e que o problema está resolvido! Great !!!

O que funcionou para mim está se movendo o seguinte código a partir page_load para 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>");
}

Melhor opção de fazer é usar o campo escondido e fazer a validação de evento não desativar, também mudam a cada caixa de listagem, dropdownlist para selecionar com o atributo de servidor runat

Se você estiver usando painel de atualização Ajax. Adicionar tag <Triggers> e dentro dela acionar o botão ou controle causando a postagem usando <asp:PostBackTrigger .../>

Se você sabe de antemão os dados que poderiam ser povoadas, você pode usar o ClientScriptManager para resolver este 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 render (em VB e C #) e declarando um valor potencial para o ddCar dropdownlist.

Em 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 uma ligeira variação em C # pode ser:

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

Para iniciantes:. Isto deve ir no código por trás do arquivo (.vb ou .cs) ou se usado no arquivo aspx você pode envolver em tags <script>

Esta foi a razão pela qual eu estava ficando-lo:

Eu tive uma ASP: ListBox. Inicialmente, ele estava escondido. No lado do cliente eu preenchê-lo via AJAX com opções. O usuário escolheu uma opção. Em seguida, ao clicar no botão Enviar, o servidor iria receber nada engraçado sobre a caixa de listagem, uma vez que não se lembrava de ter qualquer opção.

Então, o que eu fiz é para se certificar de que eu limpar todas as opções da lista antes de enviar o formulário de volta para o servidor. Dessa forma, o servidor não reclamar desde que a lista foi para o cliente esvaziar e voltou esvaziar.

Ordenado !!!

Como Nick B dito e que funcionou para mim você tem que remover as quebras de linha em alguns casos. Dê uma olhada no código:

forma -Wrong:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

forma -Direita:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

Ele só ocorreu para mim no IE10 +

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top