Оставить путь элемента управления FileUpload после обратной передачи - PullRequest
8 голосов
/ 30 сентября 2010

У меня есть элемент управления 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 "в функции загрузки ниже будет истинным, когда он был выполнен.

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

Ответы [ 6 ]

10 голосов
/ 06 октября 2010

FileUpload сохранит свое значение, только если вы удалите его из UpdatePanel. Таким образом, вы все равно можете делать все с DropDownList и его AutoPostBack, но ajax-postback не обновит FileUpload, и он станет пустым. Таким образом, вам больше не нужны постбэктригеры.

Поместите UpdatePanel только вокруг DropDownList и все элементы управления, которые должен изменить постбэк . Если эти элементы управления не расположены рядом друг с другом, вы можете использовать несколько UpdatePanels, AutoPostBack обновит все из них (поведение по умолчанию, вы даже можете изменить это).

3 голосов
/ 30 сентября 2010

Нужно ли dropDown отправлять обратно? Я думаю, что загрузка файла не работает внутри updatePanels по соображениям безопасности. Смотрите здесь:

http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspx

2 голосов
/ 11 октября 2010

Поместите свой элемент управления загрузкой файлов за пределы панели обновления, чтобы асинхронная обратная передача, вызванная выпадающим списком, не влияла на элемент управления FileUpload. Пример (упрощенный):

<asp:FileUpload runat="server" />

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

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

Дополнительное примечание: похоже, что вы храните элемент управления FileUpload в своем сеансе. Это не очень хорошая идея и может принести вам некоторые проблемы, например, когда ваши пользователи открывают одну и ту же страницу, используя несколько вкладок / окон браузера. И, я думаю, что вы, возможно, захотите сделать, это сохранить имя файла / filebyte / другие атрибуты элемента управления fileupload, вместо , сохраняя весь элемент управления в сеансе, который съест больше ресурсы вашего сервера.

2 голосов
/ 09 октября 2010

Я думаю, что нашел решение:

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>
1 голос
/ 06 октября 2010

Установите режим UpdatePanel на условный и поместите еще одну UpdatePanel, обертывающую раскрывающийся список.Таким образом, раскрывающийся список не будет публиковать файл.

Если вы хотите выполнить асинхронную загрузку файла, вы не сможете, но вы можете подделать его.

Посмотрите этот проект , он меняет цель form, поэтому ничего на вашей странице не изменится, он будет публиковаться в iframe.

0 голосов
/ 30 сентября 2010

Почему бы не отключить раскрывающийся список, когда пользователь отправляет форму.

  • Что-то вроде ...

    OnClientClick = "$ ('dropdown'). Attr ('disabled', true); вернуть true;"

на кнопке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...