Il controllo FileUpload non è pienamente compatibile con l'UpdatePanel di AJAX: per farlo funzionare, si deve specificare un trigger nell'UpdatePanel in modo da effettuare un PostBack completo della pagina quando si preme il pulsante per effettuare l'upload, altrimenti la proprietà FileUpload.HasFile avrà sempre valore false:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server"
Text="Upload..." /></ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>
</asp:UpdatePanel>
Questo comportamento è dovuto a motivi di sicurezza e alle restrizioni imposte da tutti i browser, che non permettono al codice Javascript di accedere al file system dell'utente.