Asp.net 如何获取代码隐藏母版页的内容占位符列表?
我需要获取母版页的内容占位符列表,但是属性Asp.net 如何获取代码隐藏母版页的内容占位符列表?,asp.net,reflection,c#-4.0,Asp.net,Reflection,C# 4.0,我需要获取母版页的内容占位符列表,但是属性 protected internal IList ContentPlaceHolders { get; } 是受内部保护的,因此我们无法访问它们 我们有没有办法把它们从母版页上拉出来(包括反射)?谢谢。如果您不介意使用反射,也不介意迁移到较新版本的.NET时应用程序中断的风险,那么这将起作用: IList placeholderNames = typeof(MasterPage).GetProperty("ContentPlaceHolder
protected internal IList ContentPlaceHolders { get; }
是受内部保护的,因此我们无法访问它们
我们有没有办法把它们从母版页上拉出来(包括反射)?谢谢。如果您不介意使用反射,也不介意迁移到较新版本的.NET时应用程序中断的风险,那么这将起作用:
IList placeholderNames =
typeof(MasterPage).GetProperty("ContentPlaceHolders",
BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(myMasterPage, null) as IList;
如果您不介意使用反射,也不介意在迁移到较新版本的.NET时应用程序中断的风险,那么这将起作用:
IList placeholderNames =
typeof(MasterPage).GetProperty("ContentPlaceHolders",
BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(myMasterPage, null) as IList;
您可以递归地遍历Master.Controls,并检查每个控件是否为ContentPlaceHolder类型
private readonly IList<ContentPlaceHolder> _contentPlaceHolders = new List<ContentPlaceHolder>();
private void FindContentPlaceHolders(ControlCollection controls)
{
foreach(Control control in controls)
{
if (control is ContentPlaceHolder)
{
_contentPlaceHolders.Add((ContentPlaceHolder) control);
return;
}
FindContentPlaceHolders(control.Controls);
}
}
private readonly IList\u contentPlaceHolders=new List();
私有void FindContentPlaceHolders(控件集合控件)
{
foreach(控件中的控件)
{
if(控件为ContentPlaceHolder)
{
_添加((ContentPlaceHolder)控件);
回来
}
FindContentPlaceHolder(control.Controls);
}
}
您可以递归地遍历Master.Controls,并检查每个控件是否为ContentPlaceHolder类型
private readonly IList<ContentPlaceHolder> _contentPlaceHolders = new List<ContentPlaceHolder>();
private void FindContentPlaceHolders(ControlCollection controls)
{
foreach(Control control in controls)
{
if (control is ContentPlaceHolder)
{
_contentPlaceHolders.Add((ContentPlaceHolder) control);
return;
}
FindContentPlaceHolders(control.Controls);
}
}
private readonly IList\u contentPlaceHolders=new List();
私有void FindContentPlaceHolders(控件集合控件)
{
foreach(控件中的控件)
{
if(控件为ContentPlaceHolder)
{
_添加((ContentPlaceHolder)控件);
回来
}
FindContentPlaceHolder(control.Controls);
}
}
作为Daniel答案的变体,您可以将其作为扩展方法写在母版上
:
public static IEnumerable<ContentPlaceHolder>
GetContentPlaceHolders(this MasterPage master)
{
return GetAllControlsInHierarchy(master)
.OfType<ContentPlaceHolder>();
}
private static IEnumerable<Control> GetAllControlsInHierarchy(
Control control)
{
foreach (var childControl in control.Controls)
{
yield return childControl;
foreach (var childControl in
GetAllControlsInHierarchy(childCOntrol))
{
yield return childControl;
}
}
}
公共静态IEnumerable
GetContentPlaceHolders(此母版页母版)
{
返回GetAllControlsInHierarchy(主控)
.of type();
}
私有静态IEnumerable GetAllControlsInHierarchy(
(控制)
{
foreach(control.Controls中的var childControl)
{
收益控制;
foreach(var-childControl)
GetAllControlsInHierarchy(childCOntrol))
{
收益控制;
}
}
}
作为Daniel答案的变体,您可以将其作为扩展方法写在母版上
:
public static IEnumerable<ContentPlaceHolder>
GetContentPlaceHolders(this MasterPage master)
{
return GetAllControlsInHierarchy(master)
.OfType<ContentPlaceHolder>();
}
private static IEnumerable<Control> GetAllControlsInHierarchy(
Control control)
{
foreach (var childControl in control.Controls)
{
yield return childControl;
foreach (var childControl in
GetAllControlsInHierarchy(childCOntrol))
{
yield return childControl;
}
}
}
公共静态IEnumerable
GetContentPlaceHolders(此母版页母版)
{
返回GetAllControlsInHierarchy(主控)
.of type();
}
私有静态IEnumerable GetAllControlsInHierarchy(
(控制)
{
foreach(control.Controls中的var childControl)
{
收益控制;
foreach(var-childControl)
GetAllControlsInHierarchy(childCOntrol))
{
收益控制;
}
}
}
但这比反射风险小。可能Master.Controls.Cast()。其中(a=>a是ContentPlaceHolder)。选择(a=>(ContentPlaceHolder)a也会起作用。=)我在一个旧的webforms项目(.NET3.5)上用一个带有两个ContentPlaceholder的母版页对它进行了测试,它对我很有效。我将Master.Controls传递给FindContentPlaceHolders方法。我注意到ContentPlaceholder没有直接包含在Master.Controls集合中。它们嵌套在层次结构的更底层,但这比反射风险小。可能Master.Controls.Cast()。其中(a=>a是ContentPlaceHolder)。选择(a=>(ContentPlaceHolder)a也会起作用。=)我在一个旧的webforms项目(.NET3.5)上用一个带有两个ContentPlaceholder的母版页对它进行了测试,它对我很有效。我将Master.Controls传递给FindContentPlaceHolders方法。我注意到ContentPlaceholder没有直接包含在Master.Controls集合中。它们嵌套在层次结构的更底层。也感谢您的警告。=)也谢谢你的警告。=)别忘了标记你最喜欢的答案。别忘了标记你最喜欢的答案。