【问题标题】:How To Make UserControl In MasterPage Public For All Child Pages如何使 MasterPage 中的 UserControl 对所有子页面都公开
【发布时间】:2012-12-25 00:37:38
【问题描述】:

我有一个已添加到 web.config 中的 UserControl

<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
}

【问题讨论】:

    标签: user-controls master-pages


    【解决方案1】:

    好的,我想我大致复制了你的描述,我删除了我原来的答案,因为它离题了。

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

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

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

    完成此操作后,您可以像这样引用控件

    this.Master.MessageBox.ShowInfo();
    

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

    编辑

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

    编辑

    如果您不希望您的子页面引用用户控件,您的另一个选择是在母版页上公开方法,例如 ShowInfo(),它将委托给用户控件。

    【讨论】:

    • 感谢您的回复,但是如何参考母版页呢?或者用户控件会在我的智能感知中自动在子页面中可见吗?
    • 谢谢我添加了代码..我很困惑..根据上面的说法,控件在后面的母版页代码中完美运行,如果我将控件直接放入页面..但是尝试从子页面在母版页中引用它只是无法识别公共属性/包装器方法?任何想法将不胜感激..
    • 谢谢你的帮助 Josh.. 我还以为不是我傻!!必须在每个页面上注册 UC 违背了将其放在母版页中的目的,老实说,我还不如在每个页面中创建 UC - 它的代码可能更少:S Weird!
    • 是的,这很奇怪,我仍然会在母版页中创建它...您在内容页面上谈论的所有内容都是一行指令
    • 我还想知道这对于 Web App 项目与网站的行为是否会有所不同。我相信它会的。我正在使用一个网站模型来测试它。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复,但我不确定该放在哪里?我的子页面不明白 MyMessageBox 是什么对象?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2011-12-05
      相关资源
      最近更新 更多