ASP.net FileUpload控件不跨多视图面板维护状态

时间:2011-07-12 15:03:45

标签: c# asp.net file-upload viewstate multiview

为简单起见,我有一个简单的2面板多视图。第一个是FileUpload控件,第二个是一个按钮,它发送一个包含该文件作为附件的电子邮件。当我在第二个选项卡上检查“FileUpload1.HasFile”时,它返回false。如果我回到View 1,除了文件上载空白之外,其他所有控件的所有状态都已正确维护。

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

当用户导航到View 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));
}

任何想法???

1 个答案:

答案 0 :(得分:1)

文件上传被视为安全敏感。当用户选择要上传的文件时,表单提交必须在任何其他重定向之前进行。要让浏览器允许从状态“恢复”该值,可能会导致过去的文件捕获。这是一个站点将具有带有预填充值的隐藏文件上载控件的表单。当用户提交表单时,浏览器也会上传文件(如果存在)。

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