Управлению ASCX требуется доступ к другим разделам страницы

У меня есть Page.aspx, который используется повторно. Вроде как мастер-страница (на самом деле я использую Sitecore CMS, поэтому она работает как мастер-страница, даже если это не так, и я не могу использовать this.parent). В определенном случае у меня есть элемент управления ASCX, который загружается на этой странице, и для этого требуется специальная обработка. Ему нужно скрыть / показать баннер, который лежит на Page.aspx.

Я думаю, что одним из вариантов может быть запуск события в ASCX, и его можно реализовать в Page.aspx, чтобы определить, отображается баннер или нет.

Теперь это не должно сломаться, если другие элементы управления на странице не используют событие. Можно ли этого добиться? есть ли у вас какие-нибудь другие идеи относительно того, как добиться такого поведения?


person nathanBA    schedule 22.04.2014    source источник


Ответы (4)


Вы можете перемещать событие из пользовательского элемента управления в родительский элемент. Например,

ParentAddUser.aspx

<uc1:AddUser ID="AddUser1" runat="Server" OnUserCreated="AddUser1_UserCreated">
</uc1:AddUser>

ParentAddUser.aspx.cs

protected void AddUser1_UserCreated(object sender, CommandEventArgs e)
{
    // User was created successfully. Do Something here.
}

AddUser.ascx.cs

public event CommandEventHandler UserCreated;

protected void Button_Click(object sender, EventArgs e)
{
    // Create a user
    ...

    // User was created successfully, so bubble up the event to parent. 
    UserCreated(this, new CommandEventArgs("UserId", userId.ToString()));
}
person Win    schedule 22.04.2014
comment
Пробуя этот пример, когда я выполняю Button_Click, я получаю исключение Null Reference Exception. Событие (UserCreated) равно нулю? - person Steve Staple; 23.07.2014
comment
@SteveStaple Я не могу сказать, в чем проблема. Создайте новый вопрос и разместите в нем свой код. - person Win; 23.07.2014

Вы должны использовать события, как вы предложили. Такой подход позволяет реализации быть универсальной, многоразовой и слабо связанной.

person FreeAsInBeer    schedule 22.04.2014

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

Control oBanner = this.Page.FindControl("BannerID");

if (oBanner != null) {
  oBanner.Visible = false;
}
person Yuriy Galanter    schedule 22.04.2014

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

Вам просто нужно разыграть объект Page.

        if (Page.GetType().BaseType.Name == "PageName")
        {
            ((PageName)Page).PublicFunction();
        }
person Smeegs    schedule 22.04.2014