在PostBack后保留FileUpload控件的路径

8
我有一个FileUpload控件和一个DropDownlist控件在UpdatePanel中,当用户选择FileUpload控件中的文件(还未上传),同时用户从DropDownList控件中选择一个选项,这将导致页面回发!一旦页面回发,FileUpload控件中选择的路径将消失。如何保留FileUpload控件中的路径?文件上传功能正常工作。我希望在回发期间可以保留FileUpload控件中的路径。
我已尝试以下解决方案,但是"FileUpload1.HasFile"会返回false。
            If Session("FileUpload1") Is Nothing AndAlso Upload.HasFile Then
                Session("FileUpload1") = Upload
                lblPhotoUploadErr.Text = Upload.FileName
            ElseIf Session("FileUpload1") IsNot Nothing AndAlso (Not Upload.HasFile) Then
                Upload = DirectCast(Session("FileUpload1"), FileUpload)
                lblPhotoUploadErr.Text = Upload.FileName
            ElseIf Upload.HasFile Then
                Session("FileUpload1") = Upload
                lblPhotoUploadErr.Text = Upload.FileName
            End If

但是在下面的上传函数中,“Upload.HasFile”将会在执行时为true。
Public Sub uploadPhoto()
    Dim FileOK As Boolean = False
    Dim FileSaved As Boolean = False
    Dim CandidateCode As String = Nothing
    Dim newFileName As String = Nothing

    Dim extension As String = Nothing
    Dim fileNameWithoutExt As String = Nothing

    If txtCandidateCode.Text.Trim <> "" Then
        CandidateCode = txtCandidateCode.Text.Trim
    End If

    If Upload.HasFile Then
        Dim FileExtension As String = Path.GetExtension(Upload.FileName).ToLower
        Dim allowedExtensions() As String = {".png", ".jpeg", ".jpg", ".gif"}

        Dim i As Integer = 0
        Do While (i < allowedExtensions.Length)
            If (FileExtension = allowedExtensions(i)) Then
                FileOK = True
            End If
            i = (i + 1)
        Loop
    End If

    If FileOK Then
        Try
            fileNameWithoutExt = Path.GetFileNameWithoutExtension(Upload.FileName)
            extension = Path.GetExtension(Upload.FileName)
            newFileName = fileNameWithoutExt + "_" + CandidateCode + extension

            Upload.PostedFile.SaveAs((path1 + newFileName))
            FileSaved = True
        Catch ex As Exception
            lblPhotoUploadErr.Text = ("File could not be uploaded." + ex.Message.ToString)
            FileSaved = False
        End Try
    Else
        lblPhotoUploadErr.Text = "Cannot accept files of this type."
    End If

    If FileSaved Then
        pnlUpload.Visible = False
        imgPhoto.ImageUrl = ("~/images/" + newFileName)
        hfPhotoUploadPath.Value = ("~/images/" + newFileName)

        hfFileExtension.Value = extension
        hfPhotoUploadFileName.Value = fileNameWithoutExt
    End If
End Sub

这个回答解决了你的问题吗?保留FileUpload控件值 - Michael Freidgeim
6个回答

10

如果您将FileUpload控件从UpdatePanel中取出,它就会保留其值。这样,您仍然可以使用DropDownList控件及其AutoPostBack进行所有操作,但ajax-postback不会刷新FileUpload控件,导致其变为空。这样,您就不再需要postbacktriggers了。

只在DropDownList控件周围放置UpdatePanel控件以及任何需要postback更改的控件。如果这些控件不相邻,您可以使用多个UpdatePanels控件,AutoPostBack会刷新所有这些控件(默认行为,您甚至可以更改它)。


3
我想我找到了一个解决方案:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session["FileUpload1"] = null;
    }
    else
    {
        if (FileUpload1.HasFile)
        {
            Session["FileUpload1"] = FileUpload1;
            TextBox1.Text = FileUpload1.FileName;
        }
        else if (Session["FileUpload1"] != null)
        {
            FileUpload1 = (FileUpload)Session["FileUpload1"];
            TextBox1.Text = FileUpload1.FileName;
        }
    }
}

 

<span class="spanFu">
    <asp:TextBox ID="TextBox1" Text="Select a file..." runat="server" CssClass="txt" ReadOnly="true" />
    <asp:FileUpload ID="FileUpload1" runat="server" onchange="File_OnChange(this)" CssClass="fu" />
</span>

<script>
function File_OnChange(sender) {
    val = sender.value.split('\\');
    document.getElementById('<%= TextBox1.ClientID %>').value = val[val.length - 1];
}
</script>

<style>
.spanFu .txt { width: 200px; height: 20px; }
.spanFu { position: relative; overflow: hidden; vertical-align: top; }
.fu { z-index: 1; width: 200px; height: 24px; position: absolute; top: 0px;
    left: 0px; filter: alpha(opacity=0); opacity: .0; }
</style>

3

是的!下拉框需要回传!实际上,我已经让文件上传在更新面板内工作了,效果非常好! - Fire Hand
我在Page_Load下添加了"Page.Form.Attributes.Add("enctype", "multipart/form-data")",并为上传按钮设置了PostBackTrigger。 - Fire Hand

2

将文件上传控件放置在UpdatePanel之外,这样下拉列表引起的异步回发就不会影响文件上传控件。示例(简化):

<asp:FileUpload runat="server" />

<asp:UpdatePanel runat="server">
    <asp:dropdownlist runat="server" autopostback="true" />
</asp:UpdatePanel>

<asp:button runat="server" text="Submit" />

附加说明:看起来你正在将FileUpload控件存储在会话中。这并不是一个好主意,可能会带来一些问题,例如当用户使用多个浏览器选项卡/窗口打开同一页时。我认为你想要做的是保存文件上传控件的文件名/文件字节/其他属性,而不是将整个控件存储在会话中,这将消耗更多的服务器资源。


1
将UpdatePanel模式设置为条件模式,并在下拉菜单外再套一个UpdatePanel。这样,下拉菜单就不会触发文件提交。
如果你想实现异步文件上传,是无法直接实现的,但可以进行伪装。
可以参考this project,它改变了form标签的目标,页面上的任何内容都不会改变,而是提交到一个iframe中。

-1
为什么不在用户提交表单时禁用下拉框呢?
  • 类似于...

    OnClientClick="$('dropdown').attr('disabled',true);return true;"

按钮上实现吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接