In ASP.NET 2.0 lavorando con le AJAX Extensions, per effettuare un file upload dall’interno di un UpdatePanel è necessario forzare la pagina ad effettuare un FullPostback, anziche un AsyncPostback, come lo ScriptManager ci farebbe fare automaticamente.
Per ottenere questo, di norma, è sufficiente definire nell’UpdatePanel un PostBackTrigger indicando il nome del controllo interno all’UpdatePanel stesso che deve scatenere un full postback.
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="Button1" />
</Triggers>
</asp:UpdatePanel>
Ci sono casi però in cui questo non funziona, o peggio, funziona ad intermittenza, e ci troviamo la proprietà HasFile del controllo FileUpload a false nonostante ne fosse stato selezionato uno.
L’unico workaround che ho trovato è quello di impostare (dichiarativamente o da codice nel PageLoad) la proprietà enctype del form della pagina a “multipart/form-data”; in questo modo tutto funziona bene.
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.Form.Enctype = "multipart/form-data";
}