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

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

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

page1.aspx

Я открываю другую страницу (page2.aspx) через это представление сетки в окне 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();");
        }

person Anyname Donotcare    schedule 28.03.2013    source источник
comment
Поскольку страница 2 и страница 3 являются отдельными страницами, вы не можете легко закрыть страницу 2 со страницы 3.   -  person realnero    schedule 28.03.2013
comment
Является ли page2.aspx родителем pf page3.aspx?   -  person Ali Issa    schedule 28.03.2013
comment
да page2.aspx есть кнопка, когда я нажимаю на нее открывается page3.aspx   -  person Anyname Donotcare    schedule 28.03.2013
comment
Почему вы не хотите использовать клиентскую часть?   -  person Dhawalk    schedule 28.03.2013
comment
потому что я сначала делаю код на стороне сервера, прежде чем закрыть дочерний элемент   -  person Anyname Donotcare    schedule 28.03.2013


Ответы (3)


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 и всплывающим окном браузера заключается в том, что, как и любой другой элемент DHTML, RadWindow существует только в контексте страницы, на которой он создан. Он не может выходить за пределы окна браузера.

person dst3p    schedule 02.04.2013

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

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

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

person D4rkTiger    schedule 05.04.2013

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

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

person SaadBen    schedule 02.04.2013