2012-10-26 50 views
0

我正在嘗試爲我工作的網站清理舊版母版頁。我遇到了一個問題,即我添加到標記中的用戶控件沒有將其html轉儲到頁面上。用戶控件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

是否當它不會在標記設置爲可見假工作? Page_load是否在控件中? – lgaud

+0

是的,在SiteMain.Master Page_Load中我做'homepageHeader.Visible = true;',並且homepageHeader是有效的並且是對MainHeaderTop控件的引用。 –

+0

你在哪裏將可見性設置爲true?請提供一些代碼。 – CalC

回答

1

從測試我剛剛完成的,你需要專門引用.ascx文件在你的web.config設置。

ASP.NET需要知道究竟在何處加價的控制的生活,因爲它不能只是「知道」該文件是基於你調用的類的名稱。

通過引用剛剛命名空間/組件(如你目前有),它看起來像它加載只類的一個實例。這是有效的,因爲你的代碼中有問題的類沒有試圖對位於.ascx標記中的任何服務器控件做任何事情。

如果你確實有一個服務器的控制,並試圖用它做什麼,那麼我認爲你會發現提出,因爲控制「不存在」,在這種情況下的例外。

所以我相信你需要做的是:爲每個控制你想在網上註冊以下內容。配置(顯然設置tagName和正確src)...

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

正如你說你有200多個用戶控件,你可能只是想登記常見的,然後在需要它們的個人網頁,使用普通的參考...

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

我希望這是有道理的

+0

這實際上似乎是非常有意義的。現在讓我試試這個。 –

+0

這正是問題 - 謝謝。 –

+0

太好了,很高興我能幫忙,@Mike。祝你好運與你的其他項目:-)(希望你不必擁有所有200引用!) – freefaller

0

替代方式使用(聲明說只是設置一個斷點) -

style="display:none;"默認

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

&使用jQuery:

$(function(){ 
$("#<%=homepageHeader.ClientID %>").css("display", ""); 
}); 
+0

這不是很有幫助,因爲儘管控件的Page_Load被命中,但是這個控件沒有html被轉儲到頁面。 –

相關問題