2010-09-30 5 views
8

У меня есть элемент управления FileUpload и элемент управления DropDownlist в UpdatePanel, и когда пользователь выбирает файл для элемента управления FileUpload (пока не загружается), между тем пользователь выбирает параметр из элемента управления DropDownList который вызовет обратную передачу! После обратной передачи страницы путь, выбранный в элементе управления FileUpload, исчезнет. Как я могу оставаться в элементе управления FileUpload? Была загружена функция загрузки файлов. Надеюсь, что этот путь останется в элементе управления FileUpload во время обратной передачи.Остаток пути управления FileUpload после обратной передачи

Я пробовал решение ниже, но «FileUpload1.HasFile» вернет мне ложь.

  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 

ответ

3

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

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

+0

Да! В раскрывающемся списке нужна обратная передача! На самом деле, я заставил файловую загрузку работать внутри панели обновления, и она отлично работает! –

+0

Как вы это заработали? – adrianos

+0

Я добавил «Page.Form.Attributes.Add» («enctype», «multipart/form-data») под страницей Page_Load и имеет кнопку PostBackTrigger для загрузки. –

-1

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

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

    OnClientClick = "$ ('выпадающий') атр ('отключено', правда);. Возвращает истину;"

на кнопку?

10

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

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

1

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

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

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

2

я думаю, я нашел решение:

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> 
2

Поместите свой контроль FileUpload за пределами UpdatePanel, так что асинхронный постбэк вызванное DropDownList не будет влиять на управление 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/другие атрибуты элемента управления файловой загрузкой, вместо, сохраняя весь элемент управления в сеансе, который будет потреблять больше ресурсов вашего сервера.

Смежные вопросы