2017-09-15 14 views
2

よくある質問をよく読んでいる無効なポストバックまたはコールバックの引数エラーメッセージ。GridView.DataBind呼び出し中にユーザーがクリックすると、ArgumentExceptionが発生する

リンク/リダイレクト(この場合はASP LinkBut​​tonですが、ASPボタンを使用すると同じ結果が発生します)をクリックしてWebページを急いで、WebページGridViewがデータを完成する前にこのエラーが発生します結合。

バインドされるデータが非常に大きく、理想的には、ページングを追加して実行を高速化する必要があります。ただし、クリック以外にも、クライアントスクリプトを含めて、変更されるデータはありません。なぜこのエラーが発生しているのか不明です。

全エラー:

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.

私は、セキュリティ上の理由から、イベントの検証を無効にしたくないと私は大のDataBind操作がその理由であることを知っているが、私は理由を知りません。

私も簡単なテストとして、グリッドの検証を無効にすることを試してみましたが、これで問題が解決しませんでした:

myGrid.ValidateRequestMode = ValidateRequestMode.Disabled 

のLinkBut​​tonはないあるPostBackUrlを使用して、代わりに+ Response.Redirectをクリックしてイベントを使用している(私はすべての無関係なコードを削除しました)。

の前に、LinkBut​​tonがで作成されています。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 

    Dim application As IApplication 

    If Not IsPostBack Then 

     application = Session("App")    

     If application IsNot Nothing Then 

      AddLinkButton("Test", "EntityPage", CommandType.PageLink) 
      ShowData(application)      

     End If 

    End If 

End Sub 

Private Sub AddLinkButton(label As String, commandArgument As String, 
         Optional command As CommandType = CommandType.Link) 

    Dim linkBtn As New LinkButton()   
    linkBtn.Text = label 
    linkBtn.CssClass = "myLinkBtn" 
    linkBtn.CommandName = command.ToString 
    linkBtn.CommandArgument = commandArgument 

    AddHandler linkBtn.Click, AddressOf LinkButton_Click 

    panel.Controls.Add(linkBtn) 
End Sub 


Private Sub LinkButton_Click(ByVal sender As Object, ByVal e As EventArgs) 

    Dim linkBtn As LinkButton = CType(sender, LinkButton) 

    Select linkBtn.CommandName 

     Case "Link" : 

      Response.Redirect(linkBtn.CommandArgument, False) 

     ' more cases + additional logic that I removed from the example 

    End Select 

End Sub 

Friend Sub ShowData(application As IApplication) 

    Dim entities As List(Of Entity) 

    If Not IsPostBack Then 

     entities = application.GetEntities() 
     myGridView.DataSource = entities 
     myGridView.DataBind() 

    End If 

End Sub 

なぜこれが起こっていると思いますか?また、データのバインドを正常に中断させる方法はありますか?

編集:また、LinkBut​​tonの代わりにButtonを使用し、UseSubmitBehavior = Trueを使用して同じ結果を試しました。

+0

を、ちょうど作成しますリンク(!)(aタグ)とlinkbuttonを使用しないでください。 Linkbuttonはポストバックを起こし、link-tagは発生しません。ユーザーが別のページへのリンクをたどるようにしたいので、ポストバックはここでは必要ありません。ポストバックはページ全体を解析対象のサーバーに戻しますが、時間がかかります/非効率的で、ここでは不要です。 – Esko

+0

@Eskoこれは、 "LinkBut​​ton_Click"イベントハンドラを実行できるようにすることもできますか? – Mayron

+0

私は恐れていません、あなたの例では、リダイレクト以外の何もしていない、その前に何をする必要がありますか? – Esko

答えて

3

あなたは間違って軌道に乗っている:あなたのデータもそのボリュームには何の問題もありません。何が問題なのですか?

The LinkButton is also created before the DataBind takes place.

これは単に不十分です。ダイナミックなコントロール(LinkBut​​tonなど)は、ページライフサイクルの早い段階で作成する必要があります。これは、ASP.NETがその魔法を実行し、ダイナミックコントロール用にViewStateを設定する必要があるためです。 ViewStateの作成は、Loadイベントよりもライフサイクルの早い方で発生することに注意してください。 As stated on the MSDNPreInitイベントは、ダイナミックコントロールの作成または再作成に最適な場所です。だからつもりAddLinkButonサブを取り除くと、ファイルの後ろにコード内で次を追加取得する必要があります。

Private linkBtn As LinkButton ' Declare the LinkButton variable at a module level 

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit 
    linkBtn = New LinkButton()   
    linkBtn.Text = "Test" 
    linkBtn.CssClass = "myLinkBtn" 
    linkBtn.CommandName = CommandType.PageLink.ToString 
    linkBtn.CommandArgument = "EntityPage" 

    AddHandler linkBtn.Click, AddressOf LinkButton_Click 
End Sub 

Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init 
    ' During Init all the controls have been created. 
    ' During the PreInit event the "panel" control is unavailable. 
    panel.Controls.Add(linkBtn) 
End Sub 

および負荷ハンドラ変更:あなたがリンクを作成したい場合は

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    Dim application As IApplication 

    If Not IsPostBack Then  
     application = Session("App")    
     linkBtn.Visible = application IsNot Nothing 

     If linkBtn.Visible Then 
      ' Remove that next line 
      ' AddLinkButton("Test", "EntityPage", CommandType.PageLink) 
      ShowData(application) 
     End If 
    End If 
End Sub 
+0

今日は仕事に戻ってきたので、遅れて返信して申し訳ありません。それはあなたです!働いた:) – Mayron

2

このエラーはGridViewの大量のデータのためではないと思います。これにより、正しいパス/ソースからのPostBackがページ内にEnableEventValidation="false"を設定することによって失われることが検証されます。


あなたがEnableEventValidation="false"を設定しないであろうと、あなたはこのような何か行うことができます。

  • をUpdatePanelコントロールの内側にあなたのGridViewを配置し、あなたのGridViewのためasp:AsyncPostBackTriggerトリガーを行います。あなたのGridViewで

    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
    
    <ContentTemplate> 
        <asp:GridView ID="GridView1" runat="server"OnRowCommand="GridView1_RowCommand"> 
        </asp:GridView> 
    </ContentTemplate> 
    <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="GridView1" /> 
    </Triggers> 
    
    </asp:UpdatePanel> 
    
  • RowCommandイベントを追加し、正しいe.CommandName == "LinkButtonCommandName"をチェックして、そこにあなたのLinkBut​​ton /ボタンのコードを配置し、他の作業のためのあなたのGridViewRowを見つけます。

    Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) 
        Dim index As Integer = Convert.ToInt32(e.CommandArgument) 
        Dim gvRow As GridViewRow = GridView1.Rows(index) // find GridView clicked row 
        // find LinkButton from GridView row 
        Dim LinkButton1 As LinkButton = CType(GridViewRow.FindControl("LinkButton1"), LinkButton) 
        //... here some logic 
    End Sub 
    
+0

アドバイスをいただきありがとうございます。それは問題を解決しませんでしたが、それはショットの価値があった。 GridViewは、データの量が多いため、グリッドが問題であると思った理由をページから離れるときに、データを常にレンダリングしています。 – Mayron

+0

あなたはこのエラーからあなたを保存するRowCommandのようにLinkBut​​tonを扱うことができます。 – AsifAli72090

+0

私はしようとしましたが、 "RowCommand"はボタンが押されても起動しません。 LinkBut​​tonはGridViewの内部にはなく、ページ上のリンクをクリックするとリダイレクトされます。 – Mayron

関連する問題