asp.net问题点集合

    这篇是集合在写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

posted @ 2009-10-24 01:23  shipfi  阅读(763)  评论(0编辑  收藏  举报