在使用了MasterPage后,FindControl()函数引起的问题

原创 Laughing  2017-06-30 21:21  阅读 60 次 评论 0 条

在程序开发时,需要在系统运行时获取页面中某个控件进行动态处理。如在权限控制中,根据当前用户的可操作权限进行屏蔽某些操作功能或数据。

一般来说,经常这样写代码:this.FindControl(xxx)就可以找到相关的控件;但在ASP.NET 2.0中,如果当前页使用MasterPage的机制后,放在 contentplaceholder这样的内容页的控件就无法用Page.FindControl来查找了,总是返回null。

PS:FindeControl所有容器有关(只搜索当前的容器)[/box]
灰色提示框

MSDN的解释:
FindControl 方法可用于访问在设计时其 ID 不可用的控件。此方法只搜索页的直接或顶级容器;它不在页所包含的命名容器中递归搜索控件。若要访问从属命名容器中的控件,请调用该容器的 FindControl 方法。

估计是使用了MasterPage后,引起命名容器发生变化。
在没有使用MasterPage之前,页面this访问到的对象就是他自己,所以使用this.FindControl也就没什么问题。
但用了MasterPage之后,this指向的内容就发生了变化(未找相关的信息)

这时候就需要先使用

this.Master.FindControl("contentPlaceHolderID")

来找到在MasterPage上相对的位置,再用FindControl("控件ID")来查找控件

或使用递归,找出控件(参考网上资料:

http://www.west-wind.com/WebLog/posts/5127.aspx

)
第一个页面前端:

  1. <%@ Page Language="C#" Inherits="Web.Default" MasterPageFile="~/Master.master" %>  
  2. <asp:Content id="contentHead" runat="server" ContentPlaceHolderID="contentPlaceHolderHead" >  
  3.         <title>首页</title>  
  4. </asp:Content>  
  5. <asp:Content id="contentBody" runat="server" ContentPlaceHolderID="contentPlaceHolder">  
  6.     <div class="panel panel-default">  
  7.         <div class="panel-heading">  
  8.         当前页面  
  9.         </div>  
  10.         <div class="panel-body">  
  11.         <table>  
  12.         <tr>  
  13.         <td class="col-xs-6"><asp:TextBox runat="server" class="form-control" id="txt1" name="txt1"></asp:TextBox></td>  
  14.                     <td class="col-xs-6"><asp:Button id="button1" runat="server" Text="按钮1" OnClick="button1Clicked"  CssClass="btn btn-primary"/></td>  
  15.                 </tr>  
  16.             </table>  
  17.         </div>  
  18.     </div>  
  19.     <div>  
  20.         <div class="panel panel-success">  
  21.             <div class="panel-heading">  
  22.             跳转到第二个页面  
  23.             </div>  
  24.         <div class="panel-body">  
  25.         <asp:Button id="button2" runat="server" Text="按钮2" CssClass="btn btn-success" PostBackUrl="~/Forms/Form1.aspx"></asp:Button>  
  26.                 </div>  
  27.             </div>  
  28.     </div>  
  29. </asp:Content>  

第二个页面获取:

  1. using System;  
  2. using System.Web;  
  3. using System.Web.UI;  
  4. using System.Web.UI.WebControls;  
  5. using System.Web.UI.HtmlControls;  
  6.   
  7. namespace Web  
  8. {  
  9.     public partial class Form1 : System.Web.UI.Page  
  10.     {  
  11.         public void Page_Load(object sender, EventArgs e)  
  12.         {  
  13.             if (PreviousPage != null)  
  14.             {  
  15.                 if (!IsPostBack && PreviousPage.IsCrossPagePostBack)  
  16.                 {  
  17.                     var master = PreviousPage.Master;  
  18.                     var contentBody = master.FindControl("contentPlaceHolder");  
  19.                     this.txt1.Text = ((TextBox)contentBody.FindControl("txt1")).Text;  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  
  24. }  
本文地址:https://www.lisen.me/after-using-the-masterpage-findcontrol-function-to-cause-problems.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!