用户控件html未包含在页面中

时间:2012-10-26 14:52:08

标签: c# asp.net

我正在尝试清理我正在处理的网站的遗留母版页。我遇到一个问题,即我添加到标记的用户控件没有将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;
            }
        }
    }
}

2 个答案:

答案 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", "");
});