【问题标题】:Gridview inside UpdatePanel on ModalDialog not updating after AsyncFileUpload在 AsyncFileUpload 后,ModalDialog 上的 UpdatePanel 中的 Gridview 未更新
【发布时间】:2012-07-06 18:28:12
【问题描述】:

我在更新面板中有一个 GridView,还有一个用于上传图像的 AsyncFileUpload(在更新面板之外)。所有这些都在使用 SHOWMODALDIALOG 调用的 ASPX 页面中。

我要实现的目标:
1.文件上传完成后,更新面板更新,gridview显示用户刚刚添加的图像。

我面临的问题:
1. Gridview 不刷新,即使我在文件上传到数据库后有一个Databind 事件。更新面板正在通过 OnClientUploadComplete 调用的 JS 中的 __doPostBack('UpdatePanelID',' ') 进行刷新(我正在通过更新面板中显示当前时间的标签进行检查)
2. 添加图像后,每当我单击“保存更改”或“取消”按钮时,ModalDialog 都会打开一个新页面。如果我只是打开窗口并单击这些按钮,它们就可以正常工作。我确实尝试在<head> 中包含<base target="_self" />,最后以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

【问题讨论】:

    标签: asp.net gridview updatepanel postback asyncfileupload


    【解决方案1】:

    对于您的 #2 问题,我认为您不能使用客户端或服务器端脚本重新加载/刷新模式窗口。要存档相同或相似的结果,您可以让上传控件关闭模式窗口并返回一个值以指示需要重新打开。然后在父窗口中,您可以根据需要使用循环打开它。如果用户单击模态窗口上的关闭按钮或右上角的 X 按钮,模态将不会重新打开,因为它不会将“重新打开”值发送回父级。

    父页面.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);
                }
            }
        }
    }
    

    【讨论】:

    • 嗨,雷!我刚试过这个。调试时 window.location.reload() 只要此页面本身是一个新窗口就可以工作。但是,如果我将其称为 showmodaldialog,则它不起作用。关于可能是什么问题的任何想法?
    • 另外,我在 LinkedIn 上添加了你
    • 2shared.com/file/W2kCtXNu/WebSite.html 上面的链接包含示例问题的代码。主窗口运行uploader.aspx上传,从default.aspx调用uploader.aspx失败
    • 请查看更新后的答案。诀窍是在每次上传后关闭模式窗口,然后从父级重新打开它。
    • 很好的解决方案!那很聪明:)
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多