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

私が今行ったテストから、.ascxweb.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 に答える