多次上传,ajax 控制

multiple upload, ajax control

我正在尝试上传多个文件并将所有文件保存在数据 table 中。 数据 table 仅存储一个文件。

帮我解决一下,else部分出错了。 dtupload 突出显示

下面是我试过的:

Private Sub AjaxFileUpload1_UploadComplete(sender As Object, e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete
        Try
            

            
                dt.Rows.Add(UploadDocPath, UploadDoc)
                MsgBox(dt.Rows.Count.ToString)

            Else
                dt.Rows.Add(UploadDocPath, UploadDoc)
            End If





        Catch ex As Exception

        End Try

    End Sub

那么,您在一个本地例程中创建一个 table,添加一行。然后例程结束,所有值、变量现在都超出范围。如果第二个文件是 up-loaded,并且你 re-create table,那么将再次调用该例程。该例程中的变量(实际上是任何例程 - 即使这不是 asp.net 在例程完成时超出范围。

至少对于桌面应用程序,您可以在表单级别(而不是子例程级别)声明 table,然后您可以向该临时 table 变量添加一个新行。但是,使用 asp.net,您的网页将“无状态”。这意味着所有变量只有在代码 运行s 时才有它们的状态。代码完成的瞬间,后面代码中的所有状态都将丢失。

但我有点困惑,您会认为数据 table 会在每次调用时持续存在吗?也许您只希望 var dtUpload 存在于调用该例程的每个单独时间的生命周期中?但是,再一次你对 table?????

什么都不做

那么,对于每个文件 up-loaded?该例程被调用。 因此,假设 5 个文件是 up-loaded.

真的很疯狂地猜测?我假设我们希望 table/array 随着时间的推移而增加。

因此,我们需要确保 dtUpload table 能够“存活”到单页循环和往返之外。 因此,让 save/place/put/park 可以“超越”那个例程的 dtUpload table。

这真的取决于说完之后你想用那个列表做什么?

既然table小了?然后你当然可以在表单 on-load 事件中创建没有行的 table 并将其推入会话()。然后作为每个文件 up-loads 您可以将文件名推入该数组。

因此,您的代码可以像这样工作:

仅在 on-load 事件中第一次创建 dtUpload table。然后 shove/save 它进入 session().

所以,我们的 on-load 看起来像这样:

    If IsPostBack = False Then
        ' fist time page load - create our table
        Dim dtUpload As New DataTable
        dtUpload.Columns.Add("PATH")
        dtUpload.Columns.Add("FILENAME")

        Session("FileList") = dtUpload
    End If

好的,所以当页面加载时(仅限第一次),我们创建 dtTable,然后将其保存在会话中。

现在,在文件上传完成事件中,从会话中获取 table,添加行(文件 + 路径)。 并注意我们如何不必将 dtUpload table 推回到会话中! (它现在是我们会话中的持久对象)。

好的,现在我们的单个文件加载事件(完成后)can/will 看起来像这样:

Protected Sub AjaxFileUpload1_UploadComplete(sender As Object, 
   e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete

    Dim dtUpload As DataTable = Session("FileList")

    Dim strPath As String = "c:\Test\MyUpload\"
    Dim strFile As String = e.FileName
    dtUpload.Rows.Add(strPath, strFile)
    AjaxFileUpload1.SaveAs(strPath & strFile)

End Sub

因此,请注意我们如何将这一行添加到 table。 (而且我们不必像之前提到的那样将对象推回会话中 - 在这种情况下,dtUpload 实际上是一个指向我们放入 Session() 中的持久 dtUpload table 的对象。

好的,现在假设所有 5 个文件都已完成。

那么,您现在必须决定要用您拥有的 dtUpload table 做什么?

也许我们想显示所有文件?

请记住,该网页不会执行 post 返回。

但是,假设我们现在要显示所有文件。

将数据网格控件拖到窗体上。 将一个按钮拖到窗体上。

所以,我们现在有这个:

然后点击up-load,你会得到这个:

当你点击按钮时,你可以运行这个代码:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.GridView1.DataSource = Session("FileList")
    Me.DataBind()
End Sub

然后点击那个按钮?

你看到这个:

现在这是一个非常非常重要的原因,为什么要在表单上放置该按钮。原因当然是 ajax 上传完成的时间?

该网页不执行 post 返回。所以,这就是上面的按钮发挥作用的地方。

通过单击按钮,然后我们的代码存根 运行s,我们填充网格视图,然后页面当然进行往返和 re-displays 我们的文件列表。

现在,我们可以让最终的客户端 ajaxfileupload 事件为我们单击该按钮,从而代替用户单击该按钮继续?

您可以让客户端代码为您点击该按钮。

因此,将 OnClientUpLoadCompleteAll 设置为 js 例程:

    <script>
        function uerror() {
            alert('upload error');
        }

        function myalldone() {
            var btn = document.getElementById('<%=Button1.ClientID%>');
            btn.click();
        }
    </script>

所以它现在会点击那个按钮(你甚至可以为按钮设置 style="display:none"。所以,现在你有一个最终的例行服务器端,但是有一个完整的页面 post 返回.