2009-04-20 44 views
1

我有我已經加入到我的web.config如何使用戶控件在母版公開所有子網頁

<add tagPrefix="BCF" src="~/controls/MyMessageBox.ascx" tagName="error"/> 

,並添加到我的母版頁現在

<BCF:error ID="BCError" runat="server" Visible="false" /> 

我需要一個用戶控件能夠從使用該主頁面的所有子頁面引用此控件及其公共屬性。我這樣做是我的BasePage OnLoad事件

public UserControl BCError; 
BCError = (UserControl)Master.FindControl("BCError"); 

問題是,雖然我可以在.aspx頁面

BCError.Visible = true; 

我不能引用任何我已經把控件的屬性做到這一點?如ShowError ..如果我做

BCError.ShowError = "Error Message"; 

我剛剛得到一個錯誤說

「System.Web.UI.UserControl」不包含一個定義爲「ShowInfo」,沒有擴展方法「ShowInfo '

請你指點我正確的方向!

這是用戶控件的代碼...我可以在後面的母版頁代碼中使用屬性(並且在頁面中,如果我直接將控件放入其中),但不能在後面的子頁面代碼中使用它們? ?它甚至不顯示智能感知中的屬性或包裝方法?

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 

public partial class MyMessageBox : System.Web.UI.UserControl 
{ 
    #region Properties 
    public bool ShowCloseButton { get; set; } 

    #endregion 

    #region Load 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ShowCloseButton) 
      CloseButton.Attributes.Add("onclick", "document.getElementById('" + MessageBox.ClientID + "').style.display = 'none'"); 
    } 
    #endregion 

    #region Wrapper methods 
    public void ShowError(string message) 
    { 
     Show(MessageType.Error, message); 
    } 

    public void ShowInfo(string message) 
    { 
     Show(MessageType.Info, message); 
    } 

    public void ShowSuccess(string message) 
    { 
     Show(MessageType.Success, message); 
    } 

    public void ShowWarning(string message) 
    { 
     Show(MessageType.Warning, message); 
    } 
    #endregion 

    #region Show control 
    public void Show(MessageType messageType, string message) 
    { 
     CloseButton.Visible = ShowCloseButton; 
     litMessage.Text = message; 

     MessageBox.CssClass = messageType.ToString().ToLower(); 
     this.Visible = true; 
    } 
    #endregion 

    #region Enum 
    public enum MessageType 
    { 
     Error = 1, 
     Info = 2, 
     Success = 3, 
     Warning = 4 
    } 
    #endregion 
} 

回答

0

好的我認爲我大致上複製了你的描述和我刪除了我原來的答案,因爲它是關閉的。

我發現當你想要一個內容頁面引用一個在母版頁中使用的用戶控件,並且該控件是可訪問的而不是的時,你會得到一個錯誤,指出你需要引用一個特定的程序集,然後你會得到錯誤,指出沒有類型等的方法存在。

通過將子頁面上的Register頁面指令添加到用戶控件來解決此問題。我甚至用web.config或頁面中定義的控件重現了這一點。在這兩種情況下,我仍然必須在內容頁面上明確添加註冊表。

這對我沒有意義,但它允許我的代碼編譯和工作。給它一個讓我知道。

一旦你這樣做,你可以參考像

this.Master.MessageBox.ShowInfo(); 

控制這假定您有呼籲母版頁MessageBox的公共財產。

編輯

我還發現,這個如果你註冊的主人和內容頁都在控制,而不是使用web.config中的效果要好得多。

編輯

如果你不希望你的孩子頁面引用用戶控件的另一種選擇是暴露的母版頁一樣ShowInfo(),這將委託給用戶控件上的方法。

+0

感謝回答,但我如何引用母版?或者,我的智能感知系統中的用戶控件會自動顯示在子頁面中嗎? – leen3o 2009-04-20 15:40:04

+0

Thhanks我已經添加了代碼..我迷惑..根據上述,控制完美地在後面的主頁代碼和如果我把控制權直接放入一個頁面..但試圖引用它在主頁從一個子頁面,它只是不承認公共屬性/包裝方法?任何想法將非常讚賞.. – leen3o 2009-04-20 17:03:09

0

您需要聲明它作爲控件類型來訪問它的屬性。

public MyMessageBox BCError; 
BCError = (MyMessageBox)Master.FindControl("BCError"); 
0

嘗試在從母版頁繼承頁面中使用這樣的:

<%@ MasterType VirtualPath="~/MasterPageName.Master" %>