2011年10月19日 星期三

存取控制項 ClientId 或 UniqueId 會造成 __PostBack 動作不正確?

這個問題原來不是只有我遇到,國外也有人遇到相同的現象,但都沒有很好的解法

http://forums.asp.net/t/1229919.aspx/1/10

UpdatePanel: __doPostBack('MyControl.ClientID') does not cause partial postback...why?

原由:我想利用DataGrid提供使用者進行 DataTable資料維護,其中有一欄位是日期,所以想在DataGrid中加入「日曆」功能,因為資料繕打是在 Clinet端,為了減少 PostBack的次數,所以不想用Server Controller的日曆,就利用DataGrid樣板功能,將其中一個資料欄轉成TemplateField,並在裡頭加入 Html控制項
(.aspx 部分程式)
<asp:TemplateField ....>
<EditItemTemplate>
<asp:TextBox ID="MilesDate" runat="server" Text='<%# Bind("MilesDate", "{0:yyyy/MM/dd}") %>' ></asp:TextBox>
<asp:ImageButton alt="" src="Images/im_calendar.gif" id="MilesDate_calendar" runat="server" />
</EditItemTemplate>
<ItemTemplate>
.....
</asp:TemplateField>

在後端的程式碼中加入:
protected void MileStoneMaintain_RowCreated(object sender, GridViewRowEventArgs e)
{
TextBox MilesDate = (TextBox)e.Row.FindControl("MilesDate");
ImageButton MilesDate_calendar = (ImageButton)e.Row.FindControl("MilesDate_calendar");
if (MilesDate != null)
{
MilesDate.Attributes.Add("Readonly", "readonly");
MilesDate.Attributes.Add("rel", "MilesDate");

MilesDate_calendar.OnClientClick= String.Format("newCalWindow('/SuperHall/Index.htm', {0}.{1}.value,'Objfield={0}.{1}');return false;", Page.Form.Name.ToString(), MilesDate.ClientId.ToString());
}

程式執行後,按下Grid上的「編輯」確實進行編輯模式,但「更新」確無作用,如果上面綠色那一行註解掉,就正常,但日曆控制項就不能用。

後來追蹤發現是因為 MilesDate.ClientID 造成的,雖然同事建議我改用 UniqueID,但結果一樣,可以查看在瀏覽器上的原始碼:
如果不用 ClientId,MilesDate會轉換成
<input name="MileStoneMaintain$ctl04$MilesDate" type="text" value="2011/11/15" id="MileStoneMaintain_ctl04_MilesDate"

可是加上 ClientId 之後:
<input name="MilesDate" type="text" value="2011/11/15" id="MilesDate"

明顯看出兩者前後的差別。

而最絕的是「更新」,在沒有使用 ClientID時:
<a href="javascript:__doPostBack('MileStoneMaintain$ctl05$ctl00','')">更新</a>

使用 ClinetID時,竟變成:
<a href=
"javascript:__doPostBack('ctl00','')">更新</a>

難怪輸入的資料不能更新!!!!


後記:
不要以為在程式碼中使用 ClientID才造成這個問題,如你在 Debug,想用 監看式來查看 ClientID的內容,也會造成上面的現象,千錯萬錯是 ClientID的錯,絕不是你的程式寫錯了!

因為我只有 VS2008,這個問題並沒有在 VS2010上進行確認,如果有人結果,煩請通知!

沒有留言:

張貼留言