Можно ли вызвать событие на стороне сервера на родительской странице, когда дочерняя страница закрывается? - PullRequest
0 голосов
/ 13 января 2010

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

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Из дочернего окна вы не можете «вызвать» функцию на стороне сервера для родительской страницы, однако вы можете использовать некоторый JavaScript для вызова функций на стороне клиента на этой странице.

На родительской странице:

<script language="Javascript" type="text/javascript">
function CallAlert()
{
    alert("This is parent window's alert function.");
}
</script>

На дочерней странице:

<script language="Javascript" type="text/javascript">
function CallParentWindowAlert()
{
    window.opener.CallAlert();
    return false;
}
</script>

В приведенном вами примере, в частности, где у вас есть UpdatePanel, вы фактически оставили здесь несколько вариантов. Если для UpdatePanel установлен какой-либо триггер, который заставляет его обновляться, будь то все дочерние или только указанные, в родительской функции вы можете принудительно выполнить обратную передачу на одном из этих элементов управления. В конечном счете, функция javascript родительских страниц должна иметь некоторую форму вызова __doPostBack (), ссылающуюся на id элемента управления и некоторый (пустой) параметр, однако вам, вероятно, будет лучше сгенерировать этот javascript с codebehind через:

Page.ClientScript.GetPostBackEventReference(control, null);

Как только вы соберете это вместе, все дело в том, чтобы связать фактический вызов с любым клиентским событием, которое вы хотите на своей дочерней странице, будь то onUnLoad () или в какой-то пользовательской функции, которую вы вызываете.

0 голосов
/ 13 января 2010

Попробуйте все, что вам нужно сделать, это вызвать __doPostBack на родительской странице, нацеленной на панель обновлений, или что-то еще на панели обновлений.

Родительский код:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h1>Parent Window</h1>
        Time:
        <%= DateTime.Now.ToString() %>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                Update Panel Time<%= DateTime.Now.ToString() %>
                <br />
                <asp:Button ID="Button1" Text="Submit" runat="server" />
                <a href="#" onclick="window.open('child.aspx')">Click To Open Child Window</a>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

Код ребенка:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script type="text/javascript" language="javascript">
        function UnloadMe() {
            if (opener) {
                opener.__doPostBack("UpdatePanel1", "");
            }
        }
    </script>

</head>
<body onunload="UnloadMe()">
    <form id="form1" runat="server">
    <div>
    <h1>Child Window</h1>
    </div>
    </form>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...