Как закрыть родительское окно из своего дочернего элемента?

У меня есть следующий случай:

У меня есть gridview на моей странице:

page1.aspx

Я открываю другую страницу (page2.aspx) через это gridview в окне rad, после чего через некоторую кнопку на page2.aspx открываю последнюю страницу (page3.aspx) в rad window.

все эти шаги выполняются с помощью кода на стороне сервера:


 protected void OpenNewWindow(string url, int width, int height, int mode)
        {
            RadWindow newWindow = new RadWindow();
            newWindow.NavigateUrl = url;
            newWindow.VisibleOnPageLoad = true;
            newWindow.KeepInScreenBounds = true;
            newWindow.Skin = "Metro";
            if (width > 0)
            {
                newWindow.Width = width;


            }
            if (height > 0)
            {
                newWindow.Height = height;
            }
            newWindow.VisibleStatusbar = false;
            if (mode == 0)
            {
                {

                }
                //newWindow.OnClientClose = "OnChildWindowClosed";
                newWindow.DestroyOnClose = true;
                newWindow.InitialBehaviors = WindowBehaviors.Maximize;
            }
            RadWindowManager1.Windows.Add(newWindow);
        }

Что я хочу сделать:

при нажатии на определенную кнопку на моей (page3.aspx) закройте ее и ее родительский page2.aspx.

Как это сделать (на стороне сервера)?

Я пробую это: но он просто закрывает дочерний элемент page3.aspx Я хочу закрыть родительский page2.aspx также?!


  protected void Button1_Click(object sender, EventArgs e)
        {
            ((RadAjaxManager)this.Parent.FindControl("RadAjaxManager1")).ResponseScripts.Add("CloseModal();");

            RadAjaxManager1.ResponseScripts.Add("CloseModal();");
        }

Ответы

Ответ 1

protected void Button1_Click(object sender, EventArgs e)
{
    ((RadAjaxManager)this.Parent.FindControl("RadAjaxManager1")).ResponseScripts.Add("CloseModal();");

    RadAjaxManager1.ResponseScripts.Add("CloseModal();");
}

Если событие CloseModal() запускается правильно, вы можете вызвать window.close() внутри него. RadWindows существует только в контексте родительского окна, поэтому вы все равно можете вызвать window.close(), который закроет каждое открывающееся окно.

Изменить:, хотя немного не по теме, эта ссылка от Telerik показывает вам, как получить доступ к родительское окно из RadWindow. Затем вы можете вызвать клиентскую сторону метода close, чтобы закрыть окно браузера (page1.aspx), который закроет все последующие RadWindows.

От эта ссылка:

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

Ответ 2

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

public interface IClosingParent
{
    void Close();
}

public class PageA : System.Web.Page, IClosingParent
{
    public void IClosingParent.Close()
    {
        //Code to close it or hide it
    }
}

public class PageB : System.Web.Page, ClosingParent
{
    public void IClosingParent.Close()
    {
        ((IClosingParent)this.Parent).Close();

        //Code to close it or hide it
    }
}

public class PageC : System.Web.Page
{        
    protected void ButtonClose_Click(object sender, EventArgs e)
    {
        ((IClosingParent)this.Parent).Close();

        //Code to close it or hide it     
    }
}

В том числе вы должны объявить RadWindow в родительский. Таким образом, в иерархическом представлении это выглядит следующим образом:

PageA : IClosingParent
|
|-- PageB : IClosingParent
    |
    |-- PageC
        |-- ButtonClose

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

Ответ 3

Это может показаться деревенским, но почему бы вам просто не выполнить код сервера, который вы хотите запустить до закрытия, а затем вернуть клиенту параметр bool, который позволяет ему запускать оператор if, который закрывает окно (на стороне клиента )?

PS: Я думаю, что алгоритмически, у меня нет большого опыта работы с серверной С#.