gpt4 book ai didi

c# - 在母版页中查找 ContentPlaceHolders

转载 作者:行者123 更新时间:2023-11-30 18:07:46 27 4
gpt4 key购买 nike

我正在寻找一种动态加载母版页的方法,以便在其中获取 ContentPlaceHolders 的集合。

我宁愿不必加载页面对象来分配母版页,然后才能访问它的控件,但如果这是唯一的方式,我会很乐意使用它。这是我希望它能工作的方式:

        Page page = new Page();
page.MasterPageFile = "~/home.master";
foreach (Control control in page.Master.Controls)
{
if (control.GetType() == typeof(ContentPlaceHolder))
{
// add placeholder id to collection
}
}

但是page.Master 抛出空引用异常。它似乎只在页面生命周期中创建实际页面时的某个时刻加载。

我什至想在 Page_Init() 上动态更改当前页面的 MasterPageFile,读取所有 ContentPlaceHolder,然后将原始 MasterPageFile 分配回去,但这太可怕了!

有没有办法将母版页独立于实际页面加载到内存中,以便我可以访问它的属性?

我的最后一招可能是解析 ContentPlaceHolders 的母版页内容,这不是那么优雅,但可能会更快一些。

有人能帮忙吗?非常感谢。

最佳答案

您应该能够使用 LoadControl 加载母版页并枚举控件集合。

  var site1Master = LoadControl("Site1.Master");

要查找内容控件,您需要递归搜索控件集合。这是一个快速而肮脏的例子。

static class WebHelper
{
public static IList<T> FindControlsByType<T>(Control root)
where T : Control
{
List<T> controls = new List<T>();
FindControlsByType<T>(root, controls);
return controls;
}

private static void FindControlsByType<T>(Control root, IList<T> controls)
where T : Control
{
foreach (Control control in root.Controls)
{
if (control is T)
{
controls.Add(control as T);
}
if (control.Controls.Count > 0)
{
FindControlsByType<T>(control, controls);
}
}
}
}

上面的可以如下使用

  // Load the Master Page
var site1Master = LoadControl("Site1.Master");

// Find the list of ContentPlaceHolder controls
var controls = WebHelper.FindControlsByType<ContentPlaceHolder>(site1Master);

// Do something with each control that was found
foreach (var control in controls)
{
Response.Write(control.ClientID);
Response.Write("<br />");
}

关于c# - 在母版页中查找 ContentPlaceHolders,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com