asp.net问题点集合
这篇是集合在写asp.net程序中碰到的各种问题集合。平时遇到的问题慢慢累积在这儿,以后碰到时,有个印象,也好到这儿来寻找解答。
目录
a. 在母板页中,为什么刷新后使用Request.params取不到控件中的值
1.在母板页中,为什么刷新后使用Request.params取不到控件中的值
今天碰到一个很奇怪的现象,在一个如下的母板页中:
<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函数中编辑如下代码:
{
Label1.Text = Request.Params["TextBox1"];
}
按照理解,在点击Button后,Label1会显示TextBox1中的值。但是结果什么也没有。原因是:
.Request.Form根据ClientID获取值,而不是ID。嵌套在Repeater或者FormView这类控件里面,ClientID是自身ID加上容器控件的ID作为前缀,因此不同于ID本身。
.因为嵌套了容器控件,所以在Page级别进行FindControl也是找不到的,你要在容器控件上做FindControl。
上面的例子应该修改成:
{
TextBox tb = (TextBox)Page.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");
Label1.Text = tb.Text;
}
当然,以上针对服务器控件来看,好像是多余了,直接使用Label1.Text = TextBox1.Text就可以了。
但是,如果是HTML控件,这样就比较有效果了。比如:
<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中的值,可以这样:
{
// 嵌套容器,在容器上做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