如何在所有子页面的主页面公共中进行用户控制

时间:2009-04-20 14:58:26

标签: user-controls master-pages

我有一个UserControl,我已经添加到我的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'

请指点我正确的方向!

这是用户控件的代码...我可以使用后面的母版页代码中的属性(如果我将控件直接放入页面中,则在页面中)但是不能在后面的子页面代码中使用它们?它甚至没有显示intellisense中的属性或包装器方法?

    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
}

3 个答案:

答案 0 :(得分:0)

好的,我认为我大致重现了你的描述,我删除了原来的答案,因为它已经过时了。

我发现当您希望内容页面引用在母版页中使用的用户控件并且该控件是可访问的而不是可访问的时,您将收到一条错误,指示您需要引用特定的程序集,并且然后你会得到错误,表明没有类型的方法存在。

通过将子页面上的Register页面指令添加到用户控件解决了此问题。我甚至使用web.config或页面中定义的控件重现了这一点。在这两种情况下,我仍然必须在内容页面上明确添加注册。

这对我没有意义,但它允许我的代码编译和工作。试一试让我知道。

执行此操作后,您可以像

一样引用控件
this.Master.MessageBox.ShowInfo();

这假设您在母版页上有一个名为MessageBox的公共属性。

修改

我还发现,如果您在主页面和内容页面上注册控件而不使用web.config,则效果会更好。

修改

如果您不希望您的子页面引用用户控件,则您的其他选项是在主页面上公开方法,如ShowInfo(),它将委派给用户控件。

答案 1 :(得分:0)

您需要将其声明为您的控件类型才能访问其属性。

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

答案 2 :(得分:0)

尝试在从母版页继承的页面中使用它:

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