多次上传,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 返回.
我正在尝试上传多个文件并将所有文件保存在数据 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 返回.