2013-04-02 40 views
1

我有一個母版(MyBoxx.Master)引用2個用戶控件:獲取和內容頁投母版用戶控件訪問特定的UC物業

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MyBoxx.master.cs" Inherits="MyBoxxMaster" %> 
<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %> 
<%@ Register TagPrefix="uc1" TagName="Footer" Src="Footer.ascx" %> 

我的用戶控制「頁眉」除其他外包含搜索框。我想在訪問某些頁面時隱藏此搜索框。所以我加了一個布爾屬性,我的用戶控制和渲染的用戶控件時,使用此屬性來定是否顯示搜索框或不:

public partial class uxHeader : System.Web.UI.UserControl 
{ 

    bool _showSearch = true; 
    public bool ShowSearch 
    { 
     get { return _showSearch; } 
     set { _showSearch = value; } 
    } 
    [...] 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     [...] 
     searchBox.Visible = _showSearch; 

    } 
} 

然後我嘗試從內容頁訪問此「ShowSearch」屬性:

((uxHeader)Page.Master.FindControl("Header1")).ShowSearch = false; 

問題是我在嘗試編譯時出現以下錯誤:

Error 15 The type or namespace name 'uxHeader' could not be found (are you missing a using directive or an assembly reference?) 

的事情是我相信我得到它的工作和補償在某些時候,它可以在先前發佈的生產版本上運行。但現在我正在對同一站點中的其他內容進行更改,並且無法再編譯。

從各個崗位上的話,我嘗試添加以下行到我的內容頁面的aspx:

<%@ MasterType VirtualPath="~/MyBoxx.master"%> 
<%@ Reference VirtualPath="~/MyBoxx.master" %> 

沒有任何成功!我也看到了有關頁面生命週期的一些答案,但這不是問題,因爲我在編譯時遇到錯誤,而不是執行時的錯誤。

如果有人對我如何解決這個問題有任何建議,我會非常感激。

謝謝!

+0

這部分'(uxHeader)Page.Master.FindControl'位於代碼隱藏或aspx文件中嗎?嘗試使用完全合格的名稱爲這個類 - 它會有幫助嗎?在Visual Studio中編譯期間,還是在瀏覽器中通過ASP.Net進行編譯期間,您是否收到編譯錯誤?所有類(主頁,頁面,控件)是否共享相同的程序集? – Lanorkin

+0

此代碼位於代碼隱藏部分。構建過程中出現編譯錯誤。他們都有相同的組件。 我實際上是在一個可能的解決方案,當然會發佈一個答案,如果我成功了...... –

+0

好吧,那麼你需要'使用my.namespace.here;'或'(my.namespace.here.uxHeader) Page.Master.FindControl' – Lanorkin

回答

2

好吧,我發現了幾個可行的解決方案...我想我明白前面

1)似乎編譯有一定的作用在此發揮如何/爲什麼它的工作。如果我對該行進行註釋,編譯該站點,然後嘗試再次添加該行,則類型uxHeader在VS中是「可用的」,並且我可以再次將該站點編譯回來,並取消該行的註釋...

2)As第一個解決方案顯然不是一個長期的解決方案,我發現,引用用戶控件(實際上並沒有使用,當然它)在內容頁面的aspx會做的伎倆:

<%@ Register TagPrefix="uc1" TagName="Header" Src="Header.ascx" %> 

3)我也試過這個一個,我覺得最乾淨... 在主頁面中,公開一個公共屬性:

public uxHeader PageHeader 
{ 
    get 
    { 
     return Header1;//Header1 is the id of the userControl dropped in masterpage 
    } 
} 

在內容頁ASPX,然後我就把:

<%@ MasterType VirtualPath="~/DBoxx.master"%> 

然後,仍然在內容頁面,但在代碼隱藏,並且該網站的編輯後,我可以使用:

this.Master.PageHeader.ShowSearch = false; 

希望這能幫助那些在未來尋求這方面幫助的人。我看到這是一個複發性問題

+0

你會幫助從內容頁面訪問Usercontrol嗎?在ShoppingCartControl中的ShoppingCartControl myWCtl = this.Master.FindControl(「myCtl」);在ShoppingCartControl中,它給錯誤:「類型或名稱空間不存在!任何想法? –

+0

您是否嘗試過上述解決方案?如果是,並且問題仍然存在,最好打開自己的問題,並完整地描述問題以及嘗試了什麼解決它 –

0

取決於您如何您的用戶控件編碼,你可能會或可能無法將其暴露於母版頁的母版頁屬性時可以訪問所有它的屬性/方法..

這是一個可以工作的解決方案:

在您的母版頁中,您需要註冊您的用戶控件(.ascx)並將其放置在表單標籤內的母版上。

註冊了用戶控制

<%@ Register Src="~/Controls/MyUserControl.ascx" TagPrefix="uc" TagName="MyUserControl" %> 

用戶控件添加到母版頁

<form id="frmMain" runat="server"> 
     <uc:MyUserControl runat="server" ID="ucMyUserControl" /> 
     <div id="main-wrapper"> 
      <div id="main">... 

現在的內容頁面,你必須在每個使用該內容頁的創建參考您要使用該控件的母版頁。

添加參考在內容頁

<%@ Reference Control="~/Controls/MyUserControl.ascx" %> 

現在,您可以設置在頁面級別和訪問公共變量它的屬性/方法

分部類我的頁面

Inherits System.Web.UI.Page 

    Public usrCtrl As MyUserControl 


Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

    If Master.FindControl("ucMyUserControl") IsNot Nothing Then 
     usrCtrl = CType(Master.FindControl("ucMyUserControl"), MyUserControl) 
     usrCtrl.ExecMyMethod() 
    End If 
    ... 
相關問題