如何检查ContentPlaceHolder是否绝对为空?
在ContentPlaceHolder中只有文本,没有标签和控件。
示例Page.Master:
<asp:ContentPlaceHolder runat="server" ID="Content" />示例Test.aspx:
<asp:Content runat="server" ContentPlaceHolderID="Content">
Custom text without controls. Content.Controls.Count is 0 and Content.HasControls is false.
</asp:Content>我需要做的是,当占位符为空时,put是另一个控件中的默认内容。
对于相同的占位符,重写尝试了两次,但在动态加载时我得到了错误。
发布于 2013-08-20 21:54:05
您可以实现一个将内容控件呈现为字符串的方法,然后检查该字符串以查找它是否包含任何非空白字符:
private bool HasContent(Control ctrl)
{
var sb = new System.Text.StringBuilder();
using (var sw = new System.IO.StringWriter(sb))
{
using(var tw = new HtmlTextWriter(sw))
{
ctrl.RenderControl(tw);
}
}
var output = sb.ToString().Trim();
return !String.IsNullOrEmpty(output);
}
protected void Page_PreRender(object sender, EventArgs e)
{
var placeholder = Master.FindControl("FeaturedContent");
var hasContent = HasContent(placeholder);
}发布于 2013-08-20 21:46:23
您需要首先在母版页上找到ContentPLaceHolder。然后,您可以将第一个控件(始终存在)转换为LiteralControl,并使用它的Text属性。
因此,这与内容页面的Page_Load所期望的一样工作:
protected void Page_Load(object sender, EventArgs e)
{
var cph = Page.Master.FindControl("Content") as ContentPlaceHolder;
if (contentPlaceHolder != null)
{
string textualContent = ((LiteralControl) cph.Controls[0]).Text;
if (string.IsNullOrEmpty(textualContent))
{
// ...
}
}
}发布于 2016-02-25 00:00:00
这似乎已经改变了,因为我在4.5中看到,当HasControls Content,中只有文字文本,甚至只有一个空格时,确实返回true。我在我的主页上做了这样的事情:
<asp:Panel id="SidebarPanel" CssClass="Sidebar" runat="server">
<asp:ContentPlaceHolder id="SidebarContent" runat="server" />
</asp:Panel>
Sub Page_Load(...)
SidebarPanel.Visible = SidebarContent.HasControls
End Sub这会在<div class="Sidebar">中呈现侧边栏内容(如果有的话) --并且避免在没有内容时在页面上创建一个空div。
https://stackoverflow.com/questions/18345469
复制相似问题