我遇到這樣一個需求,在頁面A上點一個鏈接,新開一個頁面B,它包含一個列表(DataGrid),選擇其中一條,關閉當前頁面,回到前一個頁面,並將我選擇的信息帶過去。實現很簡單,但是我碰到一個讓我郁悶了好久的小問題:
B頁面的“選擇”的模板列上,我是這樣寫的:
<ItemTemplate>
<ASP:HyperLink id="Hyperlink1" runat="server" Text="選擇"
NavigateUrl="<%#"Javascript:opener.document.Form1.ManagerName.value=''"
+ DataBinder.Eval(Container, "DataItem.username")+"'' ;
opener.document.Form1.ManagerId.value=''"+ DataBinder.Eval(Container, "DataItem.usercode")+"'';
window.close();"%>">選擇
</ASP:HyperLink>
</ItemTemplate>上面的代碼的目的是將UserName和UserCode分別傳遞給前一個頁面的ManagerName和ManagerId。
結果始終JS報錯:opener.document.Form1.ManagerId為空或不是對象
錯誤的意思很明白,但我很郁悶,因為我的A頁面明明白白寫著:
<asp:TextBox id="ManagerId" runat="server" Visible="false"></ASP:TextBox>
右鍵查看源代碼,那個原本隱藏的控件卻空了一行,頁面根本就沒有ManagerId這個東西。
好吧!我猜想<ASP:TextBox Visible="false">的設定就是這樣的。我換Html標簽<input type="hidden">:
<input type="hidden" runat="server" name="ManagerId" >這回我看到了這個隱藏的對象,但它的id屬性值為"_cm01"。
為什麼?!為什麼不是ManagerId?
問公司的前輩,他們解釋說,.Net下,當你沒有給Html標簽設置id屬性(你設置了name屬性),它會自動為它生成一個id屬性。如此,就產生了你碰到的問題。
建議:當你沒有辦法需要在ASPx頁面使用Html標簽時,記得給它的id和name屬性都賦上值。這樣的問題很浪費人時間。
-----------------------------------------------------------------------------------------
下面是一個很愚蠢的錯誤,很榮幸,我犯下了這個過錯:
for(int i = 0; i < dt.Rows.Count ; i++)
...{
DataRow row = dt.Rows[i];
if(row["ParentId"].ToString().Equals("aa"))
dt.Rows.Remove(row);
}
開始我寫在foreach循環裡,不過會報錯,因為foreach的循環機制是——在循環之前將所有的元素加載進內存,然後按循序遍歷,當你刪除或添加元素,那麼元素的次序已經發生了改變,循環就沒有辦法繼續。
上面那個循環的作用是,當字段ParentId值為"aa"時,刪除該行。
啊!你不覺得它有任何問題?謝謝你兄弟,你跟我是站一排的。
好吧!它的問題在於,當你刪除了一行,還進行i++的操作話,那麼跟在你刪除的那行後的一樣,將會漏過循環。這是很危險滴......
更正:
for(int i = 0; i < dt.Rows.Count ;)
{
DataRow row = dt.Rows[i];
if(row["ParentId"].ToString().Length > 0 || !row["ParentId"].ToString().Equals(""))
dt.Rows.Remove(row);
else
i++;
}
在這裡列出來,即是對自己的一個警醒,也是對大家的一個提示。
------------------------------------------------------------------------------------------------
這是一個小小的發現,有時候,我們會在url裡面傳遞一些參數,例如:
http://****.ASPx?UserType=1
而如果你的頁面有一個文本框的id也為"UserType"(假設你輸入了2),當我們使用這種方式取值時:
Request.Param["UserType"],你將得到"1,2"。
而只有這樣Request.QueryString["UserType"]才能得到"1"。