【问题标题】:Remain path of FileUpload control after postback回发后 FileUpload 控件的保留路径
【发布时间】:2010-09-30 09:55:22
【问题描述】:

我在 UpdatePanel 中有一个 FileUpload 控件和一个 DropDownlist 控件,当用户为 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

【问题讨论】:

    标签: asp.net file-upload


    【解决方案1】:

    文件上传仅在您将其从更新面板中取出时才会保留其价值。这样,您仍然可以使用 DropDownList 及其 AutoPostBack 执行所有操作,但 ajax-postback 不会刷新 FileUpload 导致它变为空。这样您就不再需要回发触发器了。

    只将UpdatePanel 放在DropDownList 周围,回发必须更改的任何控件。如果这些控件不相邻,您可以使用多个 UpdatePanel,AutoPostBack 将刷新所有这些控件(默认行为,您甚至可以更改它)。

    【讨论】:

      【解决方案2】:

      dropDown 需要回发吗?出于安全原因,我认为文件上传在 updatePanels 中不起作用。见这里:

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

      【讨论】:

      • 是的!下拉菜单需要回发!实际上,我已经让文件上传在更新面板中工作,而且效果很好!
      • 我在 Page_Load 下添加了 "Page.Form.Attributes.Add("enctype", "multipart/form-data")" 并为上传按钮添加了 PostBackTrigger。
      【解决方案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>
      

      【讨论】:

        【解决方案4】:

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

        <asp:FileUpload runat="server" />
        
        <asp:UpdatePanel runat="server">
            <asp:dropdownlist runat="server" autopostback="true" />
        </asp:UpdatePanel>
        
        <asp:button runat="server" text="Submit" />
        

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

        【讨论】:

          【解决方案5】:

          将 UpdatePanel 模式设置为有条件的,并放置另一个包裹 Dropdown 的 UpdatePanel。这样下拉菜单不会发布文件。

          如果你想进行异步文件上传,你将无法做到,但你可以伪造它。

          看看this project,它改变了form的目标,所以你的页面上什么都不会改变,它会发布到一个iframe。

          【讨论】:

            【解决方案6】:

            为什么不在用户提交表单时禁用下拉菜单。

            • 有点像……

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

            在按钮上?

            【讨论】:

              猜你喜欢
              • 2011-06-26
              • 1970-01-01
              • 1970-01-01
              • 2011-12-05
              • 2011-01-22
              • 2011-05-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多