当遍历页面上所有控件的集合(来自Page.Controls
以及那些控件的子项及其子项的子项等)时,如何判断控件是否来自Page的主页?
以下似乎有效,但感觉有点脏。有没有更好的方法来获取这些信息?
更新:抱歉,错过了之前的一些代码。
List<Control> allControls = GetAllControls(this.Page)
foreach (Control c in allControls)
{
bool isFromMaster = c.NamingContainer.TemplateControl.GetType().BaseType.BaseType == typeof(MasterPage);
}
GetAllControls
递归获取页面上的所有控件
由于
答案 0 :(得分:1)
鉴于对Control
的引用,您可以递归查看Parent
属性:
bool IsFromMasterPage(Control control)
{
while(control.Parent != null)
{
if (control.Parent is MasterPage) return true;
control = control.Parent;
}
return false;
}
答案 1 :(得分:0)
Page.Controls
仅包含当前页面的控件
如果要检查MasterPage控件,请使用:
this.Master.Controls
另一方面,如果您想在页面上找到MasterPage控件:
IEnumerable<MasterPage> masterPageControls = this.Page.Controls.OfType<MasterPage>();
虽然您只能将一个MasterPage与您的网页相关联
答案 2 :(得分:0)
解决方案原来是通过母版页的控件,不包括内容占位符的子项(因为它们为您提供了从页面本身添加的控件)。
public static bool IsFromMasterPage(Control control)
{
if (control.Page.Master != null)
{
// Get all controls on the master page, excluding those from ContentPlaceHolders
List<Control> masterPageControls = FindControlsExcludingPlaceHolderChildren(control.Page.Master);
bool match = masterPageControls.Contains(control);
return match;
}
return false;
}
public static List<Control> FindControlsExcludingPlaceHolderChildren(Control parent)
{
List<Control> controls = new List<Control>();
foreach (Control control in parent.Controls)
{
controls.Add(control);
if (control.HasControls() && control.GetType() != typeof(ContentPlaceHolder))
{
controls.AddRange(FindControlsExcludingPlaceHolderChildren(control));
}
}
return controls;
}