ASP.net FileUpload Control不能跨多视图面板维持状态

本文关键字:状态 视图 FileUpload net Control 不能 ASP | 更新日期: 2023-09-27 18:02:31

为了简单起见,我有一个简单的2面板多视图。第一个页面上有一个FileUpload控件,第二个页面上有一个按钮,用于发送带有该文件作为附件的电子邮件。当我选中FileUpload1。在第二个选项卡上,它返回为false。如果我返回到视图1,除了fileupload是空白之外,其他控件的所有状态都得到了适当的维护。

<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
    <asp:View ID="Step1" runat="server">
      <asp:FileUpload ID="FileUpload1" runat="server" Width="450" EnableViewState="true" />
    </asp:View>
    <asp:View ID="Step2" runat="server">
      <asp:Button ID="btnSubmitForm" runat="server" Text="Submit Data" onclick="btnSubmitForm_Click" />
    </asp:View>
</asp:MultiView>

当用户导航到视图2并单击按钮时:

//Initialize smtp server
            SmtpClient smtp = new SmtpClient("myHost");
            //Initialize mail message object
            MailMessage mail = new MailMessage();
//Set all mail message params (to, cc, subject etc...)
//attach file, this is where it fails to recognize the attached document. bool is false :(
if (FileUpload1.HasFile)
{
mail.Attachments.Add(new Attachment(FileUpload1.PostedFile.InputStream, FileUpload1.FileName));
}

有什么想法?

ASP.net FileUpload Control不能跨多视图面板维持状态

文件上传被视为安全敏感。当用户选择要上传的文件时,表单提交必须在任何其他重定向之前进行。让浏览器允许从状态中"恢复"值可能会导致文件钓鱼的旧时代。在这种情况下,站点将拥有一个带有隐藏文件上传控件的表单,该控件具有预先填充的值。当用户提交表单时,如果存在,浏览器也会上传该文件。

现代安全标准阻止这些尝试。如果您希望用户上传文件,则无法导航到新页面。您可以重新设计,在一个页面上完成所有工作,或者在页面导航期间获取上传的文件,将其存储到某个临时位置,返回一个唯一的id给新页面,并在提交该页面时将两者绑定在一起。并为点击返回或不继续浏览第二页的用户执行清理。