Как сделать UserControl в MasterPage общедоступным для всех дочерних страниц - PullRequest
1 голос
/ 20 апреля 2009

У меня есть 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;

Я не могу сослаться ни на одно из свойств Controls, которые я добавил? Например 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 голосов
/ 20 апреля 2009

Вам необходимо объявить его как тип элемента управления для доступа к его свойствам.

public MyMessageBox BCError;
BCError = (MyMessageBox )Master.FindControl("BCError");
0 голосов
/ 20 апреля 2010

Попробуйте использовать это на страницах, которые наследуются от вашей главной страницы:

<%@ MasterType VirtualPath="~/MasterPageName.Master" %>  
0 голосов
/ 20 апреля 2009

Хорошо, я думаю, что примерно воспроизвел то, что вы описали, и удалил свой первоначальный ответ, потому что это было далеко.

Я обнаружил, что если вы хотите, чтобы страница содержимого ссылалась на пользовательский элемент управления, используемый на главной странице, а элемент управления был доступен, а что нет, вы получите сообщение об ошибке, указывающее, что вам нужно сослаться на конкретную сборку, и тогда вы получите ошибки, указывающие на то, что не существует метода типа такого-то и такого-то.

Путем добавления директивы «Зарегистрировать страницу» на дочерней странице в пользовательский элемент управления решена эта проблема. Я воспроизвел это даже с помощью элемента управления, определенного в web.config или на странице. В обоих случаях мне все равно пришлось явно добавить Реестр на странице контента.

Это не имеет смысла для меня, но позволило моему коду скомпилироваться и работать. Дайте ему шанс, дайте мне знать.

Как только вы это сделаете, вы можете ссылаться на элемент управления, как

this.Master.MessageBox.ShowInfo();

Предполагается, что на главной странице у вас есть открытое свойство MessageBox.

Редактировать

Я также обнаружил, что это работает намного лучше, если вы регистрируете элемент управления как на главной странице, так и на странице содержимого и не используете web.config.

Редактировать

Если вы не хотите, чтобы ваша дочерняя страница ссылалась на пользовательский элемент управления, вы можете использовать другие методы на главной странице, такие как ShowInfo (), которые делегируют пользовательский элемент управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...