asp.net 很甘心的給了我們 ascx 來包裝現在控制項,它可以放到工具箱內。在使用的時候,會遇到一些問題,而解法不是這麼直覺。
(1) 在 ascx 裡面,使用 gridview,想要改變 pager style 我們會把想要的格式寫在 <PagerTemplate> 裡面。
(1.1)如果,只是寫個固定的字,就直接寫吧
<PagerTemplate> 日期: </PagerTemplate>
(1.2)如果,要加個變數值,就用 <%= .. %> 加進去
<PagerTemplate> 日期: <%=DateTime.Now.ToString("yyyy/M/d") %> </PagerTemplate>
(1.3)如果,在裡面,想用 asp.net 的元件,像是 TextBox,要顯示文定,就照以前那樣寫
<PagerTemplate><asp:TextBox ID="txt1" runat="server" Text="txtvalue1" Columns="4" /></PagerTemplate>
(1.4)如果,想要顯示變數的文字,<%= .. %>這招就不能用了,要用<%# .. %>
<PagerTemplate><asp:TextBox ID="txt1" runat="server" Text="<%# GridView1.PageCount +1 %>" Columns="4" /></PagerTemplate>
(1.5)如果,想要拿到 txt1 的 Text 的內容,頭很大。在 visual studio 2008 的編輯環境,你看不到 txt1 這個 ID。在Request.Form 裡面,txt1 的 ID 是一個變動的值。我的作法是用 GridView1.BottomPagerRow.FindControl("txt1")) 把它挖出來,再轉型、再取值。
(1.6)如果,想要產生按鈕效果,用<asp:Button /> 的話,當你按下去的時候,就會出現錯誤 (註),目前我是用 <asp:LinkButton /> 來躲開這個問題。
asp:LinkButton ID="Button_Move" Text="Move" runat="server" CommandName="Page" CommandArgument="<%#pageIndex %>" />
這個按鈕按下去,會拿到 GridView1_RowCommand 事件。有 GridViewCommandEventArgs 可以拿到 CommandArgument,就做想做的事。CommandName 如果不是 "Page" 我也不確定會不會動。
(註)
出現的錯誤如下
無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。
這個錯誤我看了很多討論,一般人就是把 enableEventValidation 設成 false 就過去了。然而事實上我們不能在正式環境中就這麼隨便。
當然也有人抱怨這錯誤訊息有看沒有懂,也有人說寫的很清楚。我的看法當然是「我看不懂」。
當我遇到這個錯誤的時候,它說明了,我要用ClientScriptManager.RegisterForEventValidation 方法來註冊。請問怎麼用?我在環境中沒有看到 ClientScriptManager 在 aspx 的哪裡?還是在 ascx 的哪裡?註冊參數怎麼給?我找到有人寫是用「Page.ClientScript.RegisterForEventValidation」,我就拿這個東西開始試。我試了我想過的在 ascx 的 page_load 區塊給 gridview 的 unique id,在 aspx 的 page_load區塊給 gridview 的 unique id,我看到有人說在 aspx 的 render區塊給 gridview 的 unique id 或是給 button 的 unique id,通通不行。找過 msdn 也沒有看到該怎麼辦。花了兩個工作天搞這麼久之後,我無聊換成 LinkButton 就沒事,我的結論就是「爛」,然後就用 LinkButton 當沒事。當然我相信一定有正規的、微軟設計好的步驟來處理這種事情,只是我還沒找到。我也期待哪天,我會看到解法,然後我就會很開心地用微軟的東西。