【轉】DataList控制元件裡新增Button,執行點選出現“回發或回撥引數無效”的解決辦法...

weixin_34391854發表於2010-04-23
DataList控制元件裡新增Button,執行點選出現“回發或回撥引數無效”的解決辦法
2009-04-23 21:21

回發或回撥引數無效。在配置中使用 <pages enableEventValidation="true"/> 或在頁面中使用 <%@ Page EnableEventValidation="true" %> 啟用了事件驗證。出於安全目的,此功能驗證回發或回撥事件的引數是否來源於最初呈現這些事件的伺服器控制元件。如果資料有效並且是預期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來註冊回發或回撥資料以進行驗證。

用LinkButton就不會出現這樣的情況,大多都是把EnableEventValidation="false",但設定成false會讓Button無反應,而且還沒有區域性的EventValidation,所以把EnableEventValidation設定成false不是首選解決辦法。

異常的出現都是“出於安全目的,此功能驗證回發或回撥事件的引數是否來源於最初呈現這些事件的伺服器控制元件”這句話所描述的原因,所以我覺得,只要給這些“不明”的Button給予“身份”,大概就能解決這個問題了

舉個例子吧,有如下一個DataList

<asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList1_ItemDataBound"
                 OnItemCommand
="DataList1_ItemCommand">
                
<ItemTemplate>
                    
<asp:Button ID="Button1" runat="server" Text='<%# Eval("CompanyName") %>' OnClick="Button1_Click" CommandName="test" />
                
</ItemTemplate>
</asp:DataList>

通過在Datalist對資料進行DataBind的時期對各Item的Button控制元件進行PostBackOptions的設定(就是給予這些Button“身份”),例子如下:

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
     {
        
if (e.Item.ItemType == ListItemType.Item ||
              e.Item.ItemType
== ListItemType.AlternatingItem)
         {
             PostBackOptions pbo
= new PostBackOptions(e.Item.FindControl("Button1"));
             pbo.ActionUrl
= "dl.aspx?page="+e.Item.ItemIndex.ToString();  // 回發的目標 URL
             pbo.PerformValidation = true;  // 指示在回發事件發生之前是否需要在客戶端進行驗證
             pbo.AutoPostBack = false;
             pbo.RequiresJavaScriptProtocol
= true;  // 指示是否為客戶端指令碼生成了 javascript: 字首
             ((Button)e.Item.FindControl("Button1")).PostBackUrl = Page.ClientScript.GetPostBackEventReference(pbo);   //給予Button“身份”
         }
     }
用上面的方法都不影響Button的Click事件和DataList的ItemCommand事件。

相關文章