Gridview внутри UpdatePanel на ModalDialog не обновляется после AsyncFileUpload

У меня есть GridView внутри панели обновления и AsyncFileUpload (за пределами панели обновления), который я использую для загрузки изображений. Все это находится на странице ASPX, вызываемой с помощью SHOWMODALDIALOG.

Чего я пытаюсь достичь:
1. Как только загрузка файла завершается, панель обновлений обновляется, и в gridview отображается изображение, только что добавленное пользователем.

Проблемы, с которыми я столкнулся:
1. Gridview не обновляется, хотя у меня есть событие Databind после загрузки файла в базу данных. Панель обновлений обновляется через __doPostBack('UpdatePanelID',' ') в JS, вызываемом OnClientUploadComplete (я проверяю это с помощью метки, показывающей текущее время на панели обновлений)
2. ModalDialog открывает новую страницу всякий раз, когда я нажимаю «Сохранить» Изменяет »или« Отменить »после добавления изображения. Если я просто открою окно и нажму на эти кнопки, они будут работать нормально. Я попытался включить <base target="_self" /> в <head> и, наконец, остановился на window.name="xxx" onload body.

Любая помощь приветствуется. Мой код:

ASPX

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="RCMT0032.aspx.vb" Inherits="RCWKSHEET.RCMT0032" EnableEventValidation="false"%>
<%@ Register TagPrefix="asp" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit"%>

<html>
<head>
<base target="RCMT0032" />
  <title>RCMT0032</title>
    <script type="text/javascript">

        function readpasseddata() {
            window.name = 'RCMT0032';
            var rpt = window.dialogArguments;
            document.getElementById("HiddenReport").value = rpt;

        }
        function UploadComplete(sender, args) {
            __doPostBack('gvupd', '');
        }         
    </script>
</head>
<body onload="readpasseddata()" >
    <form id="Form1" method="post" runat="server" target="RCMT0032" >
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></asp:ToolkitScriptManager>
    <asp:AsyncFileUpload id="BrowserHidden" Width="1" runat="server" OnClientUploadComplete="UploadComplete" OnUploadedComplete="BrowserHidden_UploadedComplete"/>
    <button class="ActionButton" id="btnSave" runat="server">Save & Exit</button>
    <button class="ActionButton" id="btnClose" runat="serverCancel</button>

    <asp:UpdatePanel id="gvupd" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
            <asp:Label runat="server" ID="Label1" />

            <asp:GridView id="GridView1" Runat="server" AutoGenerateColumns="False"
                    AllowPaging="false" EnableViewState="true" datakeynames="Seq">
                <Columns>
                <asp:TemplateField HeaderText="Comments">
                    <ItemTemplate><asp:TextBox ID="comments" Enabled="true" MaxLength="249" TextMode="MultiLine" Text='<%# Eval("Comments") %>'/>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Picture">
                    <ItemTemplate><asp:HyperLink id="PictHyper" runat="server" Target="_blank" ImageUrl='<%# String.Format("RCMT0033.aspx?report={0}&seq={1}", Eval("ReportNumber"), Eval("Seq"))%>' NavigateUrl='<%# String.Format("RCMT0034.aspx?report={0}&seq={1}", Eval("ReportNumber"), Eval("Seq"))%>' /></ItemTemplate></asp:TemplateField>         
                <asp:TemplateField HeaderText="Delete">
                    <ItemTemplate><asp:CheckBox runat="server" ID="DeleteCB" /></ItemTemplate>
                </asp:TemplateField></Columns>
        </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
    </div>
    </form>
 </body>
 </html>


КОД ЗА КАДРОМ

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoaD
        If Not IsPostBack Then
            LoadData()
            DataBind()
        Else
            With ViewState
                _intReportNumber = CInt(.Item("Report"))
                _strVendorNumber = CStr(.Item("VendorNumber"))
                _strStatus = CStr(.Item("Status"))
            End With
        End If
    End Sub

    Public Sub LoadData()
    //GET DATA INTO DATATABLE DT
            GridView1.DataSource = dt
            GridView1.DataBind()
        Catch err As Exception
            Throw err
        End Try
    End Sub

Protected Sub UploadData()
        If BrowserHidden.PostedFile IsNot Nothing AndAlso BrowserHidden.PostedFile.FileName <> "" Then
            Try
                //UPLOAD STUFF
                GridView1.DataBind()
            Catch ex As Exception
            End Try
        End If
    End Sub

    Protected Sub btnClose_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.ServerClick
        canceladd()
        ScriptManager.RegisterStartupScript(Page, Me.GetType(), "onclick", "window.open('','_self',''); window.close();", True)
    End Sub


    Protected Sub BrowserHidden_UploadedComplete(ByVal sender As System.Object, ByVal e As AjaxControlToolkit.AsyncFileUploadEventArgs)
        UploadData()
    End Sub


    Protected Sub gvupd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles gvupd.Load
        Label1.Text = DateTime.Now.ToString()
    End Sub

    Protected Sub btnSave_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.ServerClick
        FinalizeAdd()
        Page.ClientScript.RegisterStartupScript(Me.GetType(), "onclick", "window.open('','_self',''); window.close();", True)
    End Sub

person Harsimranjit Singh    schedule 06.07.2012    source источник


Ответы (1)


Что касается вашей проблемы №2, я не думаю, что вы можете перезагрузить / обновить модальное окно с помощью сценария на стороне клиента или на стороне сервера. Чтобы заархивировать тот же или похожий результат, вы можете настроить элемент управления загрузкой, чтобы закрыть модальное окно и вернуть значение, указывающее на необходимость повторного открытия. затем в родительском окне вы можете использовать цикл, чтобы открыть его по мере необходимости. если пользователь нажимает кнопку закрытия в модальном окне или кнопку X в правом верхнем углу, модальное окно не будет повторно открыто, поскольку оно не отправляет значение «повторно открыть» обратно родительскому объекту.

ParentPage.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ParentPage.aspx.cs" Inherits="WebApplication1.ParentPage" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<!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>
    <script type="text/javascript">
        function popModal(){
            var val = window.showModalDialog('ModalChild.aspx', '', '');
            while (val == "reopen") {
                val = window.showModalDialog('ModalChild.aspx', '', '');
            }
        }
    </script>
</head>
<body>
    <input type='button' value='Pop Modal' onclick='popModal();' />
</body>
</html>

ModalChild.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript">
        function closeAndReOpen(){
            window.returlValue = "reopen";
            window.close();
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </asp:ToolkitScriptManager>
    <div>
        <asp:AsyncFileUpload ID="AsyncFileUpload1" runat="server" OnClientUploadComplete="closeAndReOpen();"
            OnUploadedComplete="AsyncFileUpload1_UploadedComplete" />

        <input type='button' value='Close' onclick='window.close();' />

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound">
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <img runat="server" id="img" /></ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="AsyncFileUpload1" />
            </Triggers>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

ModalChild.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Web.UI.HtmlControls;

namespace WebApplication1
{
    public partial class ModalChild: System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LoadGrid();
            }
        }

        protected void LoadGrid()
        {
            var files = new DirectoryInfo(Server.MapPath("Data")).GetFiles("*.png");
            GridView1.DataSource = files;
            GridView1.DataBind();
        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var fi = e.Row.DataItem as FileInfo;
                var img = e.Row.FindControl("img") as HtmlImage;
                img.Src = @"Data\" + fi.Name;
            }
        }

        protected void AsyncFileUpload1_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
        {
            if (AsyncFileUpload1.PostedFile != null)
            {
                var savePath = Server.MapPath(@"Data\" + Guid.NewGuid().ToString() + ".png");
                AsyncFileUpload1.SaveAs(savePath);
            }
        }
    }
}
person Ray Cheng    schedule 09.07.2012
comment
Привет, Рэй! Я только что попробовал. При отладке window.location.reload () работает, пока эта страница сама по себе является новым окном. Если, однако, я вызываю это как showmodaldialog, это не сработает. Любые идеи о том, в чем может быть проблема? - person Harsimranjit Singh; 10.07.2012
comment
Также я добавил вас в LinkedIn - person Harsimranjit Singh; 10.07.2012
comment
2shared.com/file/W2kCtXNu/WebSite.html Ссылка выше содержит код для задачи образца. Загрузка, если вы запускаете uploader.aspx, когда работает главное окно, и не работает, когда uploader.aspx вызывается из default.aspx - person Harsimranjit Singh; 10.07.2012
comment
пожалуйста, посмотрите обновленный ответ. трюк заключается в том, чтобы закрыть модальное окно после каждой загрузки, а затем снова открыть его из родительского. - person Ray Cheng; 11.07.2012
comment
Отличное решение! Это было довольно умно :) - person Harsimranjit Singh; 11.07.2012