FileUpload在更新面板中不起作用

时间:2009-04-03 05:55:20

标签: c# asp.net

所以我要做的是让用户选择要上传的文件。由于我只接受图像,我将测试扩展。我还想将文件大小限制在2mb以下,所以我将测试它(尚未在代码中实现)。如果他们选择的文件通过,那么我希望标签说“文件被接受”,并存储文件上传信息以便稍后点击按钮。一旦用户填写完表单的其余部分,就会发生这种情况。最后,我会在检查文件是否被允许时在页面上放置一个UpdateProgress控件。我宁愿不为此发回信息,所以如果我能让它发挥作用,那就太好了。顺便说一句,如果我从更新面板中取出标签,这一切都会正常工作。

当我运行它时会发生什么,是否会转到第一个if的else语句并返回“请选择一个文件”。意味着FileUpload1.HasFile返回false。我可以看到发生这种情况的唯一原因是因为UpdatePanel无法从FileUpload控件访问该信息?

代码背后:

    Label SubmitButtonLabel2= (Label)UpdatePanel1.FindControl("SubmitButtonLabel");
    if (FileUpload1.HasFile)
    {
        string[] fileName = FileUpload1.FileName.Split('.');
        if ((fileName[fileName.Length - 1] == "jpg") ||
            (fileName[fileName.Length - 1] == "gif") ||
            (fileName[fileName.Length - 1] == "bmp") ||
            (fileName[fileName.Length - 1] == "jpeg") ||
            (fileName[fileName.Length - 1] == "png"))
        {
            SubmitButtonLabel2.Text = "File Accepted.";
        }
        else
        {
            SubmitButtonLabel2.Text = "File type not allowed.  Please choose another.";
        }
    }
    else
    {
        SubmitButtonLabel.Text = "Please select a file.";
    }

Page:

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="SubmitButton" runat="server" Text="Submit File" OnClick=SubmitButton_Click />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="always">
            <ContentTemplate>
                <asp:Label ID="SubmitButtonLabel" runat="Server" />
            </ContentTemplate>
            <Triggers>
                <asp:PostBackTrigger ControlID="SubmitButton" />
            </Triggers>
        </asp:UpdatePanel>

    </div>
</form>
</body>

11 个答案:

答案 0 :(得分:23)

无需执行任何操作,只需将多部分数据属性添加到表单中即可。

Page.Form.Attributes.Add("enctype", "multipart/form-data");

有关详细信息,请参阅以下链接。

http://knowledgebaseworld.blogspot.com/2009/02/file-upload-not-working-with-update.html

答案 1 :(得分:12)

<Triggers>
  <asp:PostBackTrigger ControlID="YourControlID" />
</Triggers>

添加UpdatePanel的触发器并提供ControlID。如果您使用TabContainer,请使用选项卡容器的ID。

答案 2 :(得分:8)

page_load

中添加此行
ScriptManager.GetCurrent(this).RegisterPostBackControl(this.Button);

答案 3 :(得分:5)

如果在“更新”面板中使用FileUpload控件,则必须为编写代码的按钮设置PostbackTrigger以保存上载文件。

现在关注代码我有btnSave按钮,用于将文件保存在upload文件夹中。所以我为它设置了postbacktrigger。

<Triggers>
            <asp:PostBackTrigger ControlID="btnSave" />
</Triggers>

希望这会对你有所帮助。

答案 4 :(得分:4)

默认的asp.net FileUpload控件永远不会与UpdatePanel一起使用。您需要AjaxControl Toolkit中定义的特殊 AsyncFileUpload 控件。此

<强> http://www.asp.net/ajax/ajaxcontroltoolkit/samples/AsyncFileUpload/AsyncFileUpload.aspx

alt text http://ruchitsurati.net/files/fileupload.png

 <ajaxToolkit:AsyncFileUpload OnClientUploadError="uploadError"
     OnClientUploadComplete="uploadComplete" runat="server"
     ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern"
     UploadingBackColor="#CCFFFF" ThrobberID="myThrobber" /> 

答案 5 :(得分:3)

不要忘记更改表单的类型,允许文件上传(enctype或类似的东西,我不在Visual Studio前面所以不能那么精确。)

我遇到了同样的问题。

答案 6 :(得分:3)

使按钮上传文件作为“上传”面板的触发器 像这样的东西,

 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="pnlUploadImage" runat="server">
 <asp:FileUpload ID="fuldImage" runat="server"></asp:FileUpload>


       <asp:LinkButton ID="lnkbUpload" runat="server" onclick="lnkbUpload_Click">Add</asp:LinkButton>
</asp:Panel>



</ContentTemplate>
<Triggers>
<asp:PostBackTrigger   ControlID="lnkbUpload"/></Triggers>
</asp:UpdatePanel>

答案 7 :(得分:3)

在使用此处发布的两个解决方案后,我开始工作了。

我必须添加两个

Page.Form.Attributes.Add("enctype", "multipart/form-data");

在Page_Load上以及

<Triggers>
    <asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>

在更新面板的标记上。

答案 8 :(得分:2)

Page.Form.Attributes.Add("enctype", "multipart/form-data");

只有这样才能解决您的问题

参考this

答案 9 :(得分:1)

You're answer can be found here

由于javascript和浏览器安全原因,默认情况下基本上不允许这样做。但这是一种解决方法。

答案 10 :(得分:0)

我的猜测是,只有在帖子已经完成时才会填写HasFile,而不是在此之前。

您可能想要在帖子完成之前检查FileUpload1.FileName是否已经填充,但我有点怀疑。