我正在尝试清理我正在处理的网站的遗留母版页。我遇到一个问题,即我添加到标记的用户控件没有将html转储到页面上。
在web.config中,我添加了这一行来注册控件的路径:
<add tagPrefix="uc" namespace="Site.Controls.Modules" assembly="Site" />
在SiteMain.Master中,我添加了这样的控件:
...
<div id="HeaderTop">
<!-- dynamic insert of header top -->
<uc:MainHeaderTop ID="homepageHeader" Visible="false" runat="server" />
</div>
...
当我加载主页面时,我将homepageHeader.Visible属性设置为true。此代码被命中并运行正常。它看起来像这样:
protected void Page_Load(object sender, EventArgs e)
{
...
// _item is the current item for this page.
if (_item.TemplateName == "Homepage")
homepageHeader.Visible = true;
else
phNotHomepageHeader.Visible = true;
...
}
如果我在MainHeaderTop的代码隐藏中设置断点,我就可以很好地点击断点。然而 - 当页面加载时,我得到的只是包装标签的空div,其中没有标记。它看起来像这样:
<div id="HeaderTop" class="homeHeader">
<!-- dynamic insert of header top -->
</div>
我是否遗漏了一些基本的东西,我需要做些什么来使这个工作?
编辑: 在SiteMain.Master OnPreRender事件中,我放置了以下代码:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string markup = string.Empty;
using (var sw = new System.IO.StringWriter())
{
using (var hw = new System.Web.UI.HtmlTextWriter(sw))
{
homepageHeader.RenderControl(hw);
markup = sw.ToString();
}
}
}
运行后,标记为空字符串。这是MainHeaderTop中的标记:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MainHeaderTop.ascx.cs"
Inherits="Site.Controls.Modules.MainHeaderTop" %>
<a href="http://www.site.com" style="width:100; height=200;">
<img src="~/media/F7E4164AF46A4B1791FCC60CE99763EC.ashx" alt="site" />
</a>
及其后面的代码:(该语句仅用于设置断点)
namespace Site.Controls.Modules
{
public partial class MainHeaderTop : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (true)
{
int i = 0;
}
}
}
}
答案 0 :(得分:1)
从我刚刚完成的测试中,您需要专门引用web.config设置中的.ascx
文件。
ASP.NET需要准确知道控件的标记位置,因为它不能只是知道&#34;文件的位置取决于您正在呼叫的课程的名称。
通过引用命名空间/程序集(就像你现在的那样),看起来它只是加载了一个类的实例。这是有效的,因为您的代码中的有问题的类不会尝试对位于.ascx标记中的任何服务器控件执行任何操作。
如果你确实有一个服务器控件,并尝试用它做一些事情,那么我认为你会发现一个例外,因为控件不存在&#34;在这种情况下。
所以我认为您需要做的是:为要在web.config中注册的每个控件添加以下内容(显然设置tagName
并更正{{1} })...
src
正如您所说,您有200多个用户控件,您可能只想注册常用的控件,然后在需要它们的各个页面中使用普通参考...
<add tagPrefix="uc" tagName="MainTopHeader" src="~/CorrectPath/MainTopHeader.ascx"/>
我希望这是有道理的
答案 1 :(得分:0)
替代方式使用 -
默认情况下 style="display:none;"
<uc:MainHeaderTop ID="homepageHeader" Visible="true" style="display:none;"
runat="server" />
&安培;使用jQuery:
$(function(){
$("#<%=homepageHeader.ClientID %>").css("display", "");
});