2010年4月13日 星期二

[www]頁頭 DOCTYPE 有無宣告差很多

今天又搞了一天。
就只是這一行:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
來看一下,有跟沒有的差別:

沒有加的如下圖
image

加了之後如下圖
image

還好現在還可以不加宣告,只是以後就過不了 xhtml 的驗證了…。以後再想辦法吧。

俗話說的好,把舊的系統改成新的,就是要注意別把原來的東西弄壞了。做舊系統的成就感真的很低…,因為別人不在乎你花了多少時間把東西改好,因為從外面看起來都一樣。其實改的人在裡面踩地雷踩大便很辛苦的。

[www]頁頭 DOCTYPE 有無宣告差很多

今天又搞了一天。
就只是這一行:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
來看一下,有跟沒有的差別:

沒有加的如下圖
image

加了之後如下圖
image

還好現在還可以不加宣告,只是以後就過不了 xhtml 的驗證了…。以後再想辦法吧。

俗話說的好,把舊的系統改成新的,就是要注意別把原來的東西弄壞了。做舊系統的成就感真的很低…,因為別人不在乎你花了多少時間把東西改好,因為從外面看起來都一樣。其實改的人在裡面踩地雷踩大便很辛苦的。

2010年4月2日 星期五

[asp.net]ajax toolkit

不曉得是我胃口太糟還是心情不好,當我終於下定決心要把 ajax control toolkit 下載回來的時候,一整個不爽。

當我從 http://www.codeplex.com/Wiki/View.aspx?ProjectName=AtlasControlToolkit 把檔案下載完,依照頁面上說,要到 http://www.asp.net/ajax/ajaxcontroltoolkit/samples/ 看一下有 demo 可以看怎麼做。我跳到那一頁之後,又看見 「To get started, and to install the Ajax Control Toolkit, visit the AJAX Control Toolkit Project Page on CodePlex.」。是裝笑維喔,又跳回來是怎樣!

好,這裡不只是要抱怨,這個世界只怕有心人。我就每一個連結都按!
原來就是在 samples 這一頁裡面,就是這句「To learn more, read the Getting Started Tutorial, or the other walkthroughs, tutorials and videos shown on the left.」,按下去之後就是了。

雖然,我知道我以後一定是只用 jQuery,但是為了怕以後去踩到 asp.net 的安全陷阱,所以先要看一下如何正確註冊用戶端的東西、如何寫伺服端的ajax控制項。畢竟包成控制項給同事,他們會開心一點。
完畢

2010年4月1日 星期四

[asp.net]web user control 網頁使用者控制項 與 GridView 的 PagerTemplate

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 當沒事。當然我相信一定有正規的、微軟設計好的步驟來處理這種事情,只是我還沒找到。我也期待哪天,我會看到解法,然後我就會很開心地用微軟的東西。