【问题标题】:Persist FileUpload Control Value保持 FileUpload 控制值
【发布时间】:2013-09-06 06:09:20
【问题描述】:

我在更新面板中有 asp.net FileUpload 控件。当我单击上传按钮时,我正在读取一些代码的文件,如果找不到代码,那么我将显示 ModalPopup 以从下拉列表中选择用户,否则将文件上传并通过电子邮件发送给该代码的用户(此代码保存在数据库中) . 如果找不到代码,它显示 ModalPopup 并删除所选文件,我想在回发后保留所选文件。 这是我的代码

<asp:UpdatePanel ID="UpdatePanel3" runat="server" >
    <ContentTemplate>
        <asp:FileUpload ID="FileUpload1" runat="server"  />
        <asp:RequiredFieldValidator ID="rfvFileupload" ValidationGroup="validate" runat="server" ErrorMessage="* required" ControlToValidate="FileUpload1"></asp:RequiredFieldValidator>
    </ContentTemplate>
</asp:UpdatePanel>

点击按钮

protected void btnupload_Click(object sender, EventArgs e)
{
    //Reading the file and Checking from Database
    if(codefound)
    {
        //Sending email to the user of the Code
    }
    else
    {
        ModalPopupExtender1.Show();
    }
}

如何在回发时保持 Upload 控件的值?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    背景:: 当使用 FileUpload Control 选择文件时,然后在回发时,PostedFile 属性将使用文件的 HttpPostedFile 对象初始化。由于http请求不能保持状态,所以它失去了它的状态。

    注意: FileUpload 控件不适用于异步回发。因此需要回发才能获取文件。一种方法是为您的上传按钮设置触发器,即&lt;asp:PostBackTrigger &gt; & NOT &lt;asp:AsyncPostBackTrigger&gt;

     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
          <ContentTemplate>
          <asp:FileUpload ID="fileUploadImage" runat="server"></asp:FileUpload>
          <asp:Button ID="btnUpload" runat="server" Text="Upload Image" 
               OnClick="btnUpload_Click" />
          </ContentTemplate>
          <Triggers>
              <asp:PostBackTrigger ControlID="btnUpload"  />
          </Triggers>
     </asp:UpdatePanel>
    

    还有你的上传按钮代码:

     protected void btnUpload_Click(object sender, EventArgs e)
         {
            if (fileUpload1.HasFile)
            {                
                fileName = fileupload1.FileName;
                fileUpload1.SaveAs("~/UploadedContent/" + fileName);
            }
         }
    

    要保持文件上传控制的价值,您可以将fileupload 对象完全存储在会话中,并在回发后从会话中检索您需要的值。

    protected void Page_Load(object sender, EventArgs e)
        {
            // store the FileUpload object in Session. 
            // "FileUpload1" is the ID of your FileUpload control
            // This condition occurs for first time you upload a file
             if (Session["FileUpload1"] == null && FileUpload1.HasFile)  
               { 
                Session["FileUpload1"] = FileUpload1; 
                Label1.Text = FileUpload1.FileName; // get the name 
               }
            // This condition will occur on next postbacks        
            else if (Session["FileUpload1"] != null && (! FileUpload1.HasFile)) 
              { 
                FileUpload1 = (FileUpload) Session["FileUpload1"]; 
                Label1.Text = FileUpload1.FileName; 
              } 
         //  when Session will have File but user want to change the file 
         // i.e. wants to upload a new file using same FileUpload control
         // so update the session to have the newly uploaded file
            else if (FileUpload1.HasFile) 
             { 
                Session["FileUpload1"] = FileUpload1; 
                Label1.Text = FileUpload1.FileName; 
             }
         }
    

    【讨论】:

    • 上述答案的第二部分实际上回答了您的问题:如何持久化 FileUpload Control vale。第一部分只是展示了如何使 FileUpload 控件在 UpdatePanel 中工作。由于您没有提到任何问题,我希望这部分已经为您工作了。
    • 我尝试这样做并收到一个错误,即 fileupload 对象不可序列化并且它不能存储在会话中。
    • 可能是 SessionMode 设置为 SQLServer 或 StateServer ,您可以尝试将其更改为 InProc 看看它是否有效?
    【解决方案2】:

    这个问题有据可查,更新面板被列为不适用于某些控件。

    文件上传和树状视图是其中的两个重要因素。

    要使其正常工作,您应该使用 Triggers/PostbackTrigger

    <asp:UpdatePanel ID="UpdatePanel3" runat="server" >
      <ContentTemplate>
        <asp:FileUpload ID="FileUpload1" runat="server"  />
        <asp:RequiredFieldValidator ID="rfvFileupload" ValidationGroup="validate" runat="server" ErrorMessage="* required" ControlToValidate="FileUpload1" />
        <asp:Buton ID="btnupload" runat="server" Text="Upload" onclick="btnupload_Click"></asp:Button>
      </ContentTemplate>
    
      <Triggers>
        <asp:PostBackTrigger   ControlID="btnupload"/>
      </Triggers>
    </asp:UpdatePanel>
    

    【讨论】:

    • 您能解释一下如何将它与触发器/回发触发器一起使用吗?
    • 请查看修改后的答案。
    【解决方案3】:

    尝试添加

    $('form').attr('enctype', 'multipart/form-data');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多