這篇是集合在寫asp.net程式中碰到的各種問題集合。平時遇到的問題慢慢累積在這兒,以後碰到時,有個印象,也好到這兒來尋找解答。
目錄
a. 在母板頁中,為什麼重新整理後使用Request.params取不到控制項中的值
1.在母板頁中,為什麼重新整理後使用Request.params取不到控制項中的值
今天碰到一個很奇怪的現象,在一個如下的母板頁中:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Button ID="Button2" runat="server" Text="Button" />
<asp:Label ID="Label1" runat="server" ForeColor="#CCFFCC" Text="BBB"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Text="bbb"></asp:TextBox>
</asp:Content>
然後在Page_load函數中編輯如下代碼:
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Request.Params["TextBox1"];
}
按照理解,在點擊Button後,Label1會顯示TextBox1中的值。但是結果什麼也沒有。原因是:
MSDN解釋:任何實現該介面的控制項都建立一個新的命名空間,在這個新的命名空間中,所有子控制項 ID 屬性在整個應用程式內保證是唯一的。由該介面提供的標記允許在支援資料繫結的 Web 伺服器控制項內唯一命名動態產生的伺服器控制項執行個體。這些控制項包括 Repeater、DataGrid、DataList、CheckBoxList、ChangePassword、LoginView、Menu、SiteMapNodeItem 及 RadioButtonList 控制項。
其它解釋:
.Request.Form根據ClientID擷取值,而不是ID。嵌套在Repeater或者FormView這類控制項裡面,ClientID是自身ID加上容器控制項的ID作為首碼,因此不同於ID本身。
.因為嵌套了容器控制項,所以在Page層級進行FindControl也是找不到的,你要在容器控制項上做FindControl。
上面的例子應該修改成:
protected void Page_Load(object sender, EventArgs e)
{
TextBox tb = (TextBox)Page.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");
Label1.Text = tb.Text;
}
當然,以上針對伺服器控制項來看,好像是多餘了,直接使用Label1.Text = TextBox1.Text就可以了。
但是,如果是HTML控制項,這樣就比較有效果了。比如:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<input type=hidden id="Dynamic_UserControl_Hidden1" runat="server" /> // HTML控制項
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick="ShowControl()" />
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
以上,在頁面重新整理後想取得Dynamic_UserControl_Hidden1中的值,可以這樣:
protected void Page_Load(object sender, EventArgs e)
{
// 嵌套容器,在容器上做FindControl
HtmlInputHidden hiHidden = (HtmlInputHidden)UpdatePanel1.ContentTemplateContainer.FindControl("Dynamic_UserControl_Hidden1");
Label1.Text = hiHidden.Value;
}
然後,還有一個就是javascript的問題:
在指令碼中使用以下語句會得到"為空白或不是對象"的錯誤
document.getElementById("TextBox1").value
主要原因也是因為在產生頁面後,控制項的ID被變掉了。可以使用以下語句
document.getElementById("<%=TextBox1.ClientId%>”).value;
具體的,可以查詢以下幾個URL:
http://www.itstrike.cn/Home/Article/Asp.net-in-the-master-page-ID-of-the-control-treatment
http://topic.csdn.net/u/20080503/18/205102e1-7f6c-4858-970e-f7b9ce390b0e.html
http://msdn.microsoft.com/zh-cn/library/system.web.ui.inamingcontainer%28VS.85%29.aspx