Tentative d'utilisation d'un contrôle FileUpload ou AsyncFileUpload dans un Updatepanel sur une application Web NET 4.5/C #.
J'ai essayé d'utiliser soit Scriptmanager standard, soit ToolKitScriptManager dans ma page maître.
Mon bouton Enregistrer est défini en tant que PostBackTrigger (essayé avec AsyncPostbackTrigger également).
Quoi qu'il en soit, mon (Async) FileUpload.HasFile renvoie toujours false.
Supprimez le panneau de mise à jour et les deux contrôles de téléchargement fonctionnent correctement.
Ce qui me jette vraiment, c’est que je travaille dans un autre projet (scriptmanager dans masterpage, Fileupload dans updatepanel, SaveButton est PostbackTrigger).
Existe-t-il une version spécifique de AJAX ou une version .NET susceptible de poser problème?
C'est extrêmement frustrant.
En ajoutant le bouton à la balise de déclenchement de UpdatePanel, je l’ai obtenu:
<asp:UpdatePanel ID="UpdatePanel" runat="server">
<ContentTemplate>
<asp:FileUpload ID="FileUpload" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload"
OnClick = "btnUpLoad_OnClick" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID = "btnUpload" />
</Triggers>
</asp:UpdatePanel>
Je n'ai pas eu à faire autre chose côté serveur (comme la réponse de user5159158).
Le téléchargement de fichier ne fonctionnera pas avec une publication partielle. Il nécessite une demande de page complète. Alors ajoutez la ligne ci-dessous dans votre chargement de page.
ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);
FileUpload nécessite une demande de page complète. Il s'agit d'une limitation du composant XmlHttpRequest utilisé dans tous les frameworks AJAX pour les appels asynchrones à l'application.
Ce qui me jette vraiment, c’est que je travaille dans un autre projet (scriptmanager dans masterpage, Fileupload dans updatepanel, SaveButton est PostbackTrigger).
Je pense que vous utilisez Full PostBack, bien que FileUpload se trouve à l'intérieur de ** UpdatePanel .
Par exemple,
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="SaveButton" runat="server" OnClick="SaveButton_Click"
Text="Upload your file" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="SaveButton" />
</Triggers>
</asp:UpdatePanel>
Si vous utilisez AsyncFileUpload avec UpdatePanel , AsyncFileUpload.HasFile ne doit être coché que dans UploadedComplete (vous ne pouvez pas vérifier à l'intérieur de l'événement Click de bouton) .
La raison en est AsyncFileUpload est chargé le fichier via Async par lui-même.
Remarque: assurez-vous d'utiliser ToolkitScriptManager au lieu de ScriptManager
<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="Server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<ajaxToolkit:AsyncFileUpload runat="server" ID="AsyncFileUpload1"
OnUploadedComplete="AsyncFileUpload1_UploadedComplete" />
<asp:TextBox runat="server" ID="TextBox1" /><br/>
<asp:Button ID="SaveButton" runat="server" OnClick="SaveButton_Click"
Text="Save" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="SaveButton" />
</Triggers>
</asp:UpdatePanel>
private string FileName
{
get { return (string)(Session["FileName"] ?? ""); }
set { Session["FileName"] = value; }
}
protected void SaveButton_Click(object sender, EventArgs e)
{
string fileName = FileName;
string path = Server.MapPath("~/App_Data/");
var fileInfo = new FileInfo(path + FileName);
}
protected void AsyncFileUpload1_UploadedComplete(object sender,
AsyncFileUploadEventArgs e)
{
if (AsyncFileUpload1.HasFile)
{
FileName = AsyncFileUpload1.FileName;
string path = Server.MapPath("~/App_Data/");
AsyncFileUpload1.SaveAs(path + AsyncFileUpload1.FileName);
}
}
Personnellement, je n'aime pas utiliser AsyncFileUpload inside UpdatePanel . Au lieu de cela, je vais plutôt utiliser Full PostBack si j'ai besoin de télécharger un fichier.
Dans Page_Load, ajoutez: Page.Form.Attributes.Add("enctype", "multipart/form-data");