0

我正在尝试为我工作的网站清理旧版母版页。我遇到了一个问题,即我添加到标记中的用户控件没有将其 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;
            }
        }
    }
}
4

2 回答 2

1

根据我刚刚完成的测试,您需要.ascx在 web.config 设置中专门引用该文件。

ASP.NET 需要确切地知道控件的标记所在的位置,因为它不能仅仅根据您正在调用的类的名称“知道”文件的位置。

通过仅引用命名空间/程序集(如您当前所拥有的),它看起来就像是在加载该类的一个实例。这是有效的,因为您的代码中的相关类没有尝试对位于 .ascx 标记中的任何服务器控件执行任何操作。

如果你确实有一个服务器控件,并试图用它做点什么,那么我认为你会发现一个异常引发,因为在这种情况下控件“不存在”。

所以我相信你需要做的是:为你想在 web.config 中注册的每个控件放置以下内容(显然设置tagName和正确src)......

<add tagPrefix="uc" tagName="MainTopHeader" src="~/CorrectPath/MainTopHeader.ascx"/>

正如您所说,您有 200 多个用户控件,您可能只想注册常用控件,然后在需要它们的各个页面中,使用普通参考...

<%@ Register TagPrefix="uc" TagName="AnotherCtrl" Src="~/CorrectPath/AnotherCtrl.ascx" %>

我希望这是有道理的

于 2012-10-26T16:12:59.137 回答
0

替代方式使用 -

style="display:none;"默认

<uc:MainHeaderTop ID="homepageHeader" Visible="true" style="display:none;" 
runat="server" />

& 使用 jQuery:

$(function(){
$("#<%=homepageHeader.ClientID %>").css("display", "");
});
于 2012-10-26T15:00:13.330 回答