我真的不想为渲染运行所有代码,或者冒着某些控件的状态在渲染后可能会发生变化的风险。所以我想出了另一种方法。
public static int ChildrenCount(ContentPlaceHolder placeholder)
{
int total = 0;
total += placeholder.Controls.OfType<Control>().Where(x =>
(!(x is ContentPlaceHolder) && !(x is LiteralControl)) ||
(x is LiteralControl && !string.IsNullOrWhiteSpace(((LiteralControl)x).Text))
).Count();
foreach (var child in placeholder.Controls.OfType<ContentPlaceHolder>())
total += ChildrenCount(child);
return total;
}
对我来说,我直接放入 Content 元素的文本将由 OfType 作为具有适当内容的 LiteralControl 返回。不仅如此,我的格式 ("\r\n\t") 也会以同样的方式返回。我还会为后续母版页获取 ContentPlaceholders,因为它们将我的网页中的插槽传递到下一个母版页或实际页面。
因此,现在的任务是获取排除这些 ContentPlaceholders 并排除作为空白的 LiteralControls 的控件的计数。这很容易使用is运算符。我们将确保给定的控件既不是这些类型,然后对其进行计数,或者如果它是 Literal,我们检查内容是否都是空格。最后一步是为所有子 ContentPlaceholder 递归地添加相同操作的结果,以便嵌套母版页按预期工作。
最后:
if (ChildrenCount(MyContentPlaceholder) == 0)
MyContentPlaceholder.Controls.Add(new LiteralControl("My default content!"));