作業しているサイトのレガシーマスターページをクリーンアップしようとしています。マークアップに追加したユーザーコントロールの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;
}
}
}
}