helpwithmycode Ответов: 1

Попытка передать функцию из master на страницу содержимого с помощью делегата, проблема поиска contentcallevent в contentpage


ИНФОРМАТИВНАЯ ПРЕДЫСТОРИЯ:
I have a ddl control in master site, i would like to call the 'selectIndexChange event' that sits in master page, and i want to call it in a content page. the reason is because i have an adio.net function that populates a grid in my content page. when i select a new item from my drop down, i dont want the event to be triggered in master page bcs frm inside master page i cant call the adio.net function thats in content page. I thought that i could fix this if i pass the selectIndexChange event from the master to the content page with a delegate. then i would be able to call the function select indexchange and my adio.net code function will be in scope. :)

ПРОБЛЕМА С МОИМ КОДОМ:
при попытке настроить мою делегатскую функцию, которая вызывает selectindexevent из mater в content, я заметил красную линию под "contentCallEvent", которую невозможно найти, она не имеет ссылки. Может быть, это потому, что моя страница контента находится в панели?
ваша помощь будет очень признательна! заранее благодарю вас

мой код ниже
:обратите внимание, что моя страница контента находится в панели.


МАСТЕР-СТРАНИЦА

protected void ddlSites_SelectedIndexChanged(object sender, EventArgs e)
      {

          if (contentCallEvent != null)
              contentCallEvent(this, EventArgs.Empty);
      }
      public event EventHandler contentCallEvent;


Объект contentpage

private void Master_ddlSites_SelectedIndexChanged(object sender, EventArgs e) {
           //from here i should be able to call function and populate grid

           populateGridViewByID_Parent("TEST");
       }


protected void Page_PreInit(object sender, EventArgs e)
       {

           Page.Master.contentCallEvent += new EventHandler(Master_ddlSites_SelectedIndexChanged);
           //error says, masterpage does not contain a reference for contentCallEvent}


Что я уже пробовал:

Я попытался найти страницу содержимого,
ContentPlaceHolder contentPage = Page.Master.FindControl("pnlCollectionsDue") as ContentPlaceHolder;

          contentPage.Page.Master += new EventHandler("ddlSites_SelectedIndexChanged");

я попытался найти выпадающий список
DropDownList ddl = this.Page.Master.FindControl("ddlSites") as DropDownList;
           ddl.SelectedIndexChanged += new EventHandler(Master_ddlSites_SelectedIndexChanged);

1 Ответов

Рейтинг:
9

F-ES Sitecore

Вам нужно сообщить странице содержимого, каков конкретный тип главной страницы, прежде чем вы сможете использовать какие-либо общедоступные свойства\методы на этой главной странице. Это можно сделать с помощью дериватива MasterType

Работа с ASP.NET мастер-страницы программно[^]

Главная страница имеет этот выпадающий список

<asp:DropDownList ID="ddlSites" runat="server" OnSelectedIndexChanged="ddlSites_SelectedIndexChanged" AutoPostBack="true">
    <asp:ListItem Text="One" Value="1" />
    <asp:ListItem Text="Two" Value="2" />
    <asp:ListItem Text="Three" Value="3" />
</asp:DropDownList>


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

public partial class SiteMaster : MasterPage
{
    public delegate void SiteSelectedEvent(string site);

    public event SiteSelectedEvent contentCallEvent;

    protected void ddlSites_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (contentCallEvent != null)
            contentCallEvent(ddlSites.SelectedValue);
    }
}


Пользовательский элемент управления

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="ProjectNamespace.MyControl" %>

<asp:Literal ID="LiteralResult" runat="server" />


Пользовательский управляющий код позади - элемент управления предоставляет метод, который позволяет вызывающему коду передавать ему данные

public partial class MyControl : System.Web.UI.UserControl
{
    public void ShowResult (string result)
    {
        LiteralResult.Text = result;
    }
}


Наконец,кодовая часть страницы контента. "MyControl1" - это идентификатор пользовательского элемента управления на странице.

protected void Page_Load(object sender, EventArgs e)
{
    Master.contentCallEvent += Master_contentCallEvent;
}

private void Master_contentCallEvent(string site)
{
    MyControl1.ShowResult(site);
}


Также обратите внимание на страницу содержание этой директивы MasterType

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


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


helpwithmycode

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

Линия 1: &ЛТ;%@ мастер языка="в C#" AutoEventWireup значение="истинной" отделенного кода="сайт.мастер.КС" наследует="PartnerPortalTest.Сайт" %&ГТ;
Строка 2: <%@ MasterType VirtualPath="~/Site.Мастер"%>

извини, чувак, я просто не знаю, что я делаю не так.

F-ES Sitecore

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

helpwithmycode

Я попробовал это сделать, и код не будет компилироваться по этой причине "UserControl" не содержит определения для "Master"!?

&ЛТ;%@ управления "язык" ="язык C#" AutoEventWireup значение="истинной" отделенного кода="GCCollectionsdue.ascx вносятся.КС" наследует="Partner_Portal.Пользовательских элементов управления.Сетки.WebUserControl1"%&ГТ;
<%@ MasterType VirtualPath="~/Site.Мастер"%>

еще раз спасибо!

F-ES Sitecore

Это пользовательский элемент управления, а не страница контента? Я думал, что код, о котором идет речь, находится на странице контента, где пользовательский элемент управления входит в вещи?

helpwithmycode

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

F-ES Sitecore

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

helpwithmycode

Это работает, большое спасибо!