web-dev-qa-db-fra.com

ASP.NET FileUpload dans UpdatePanel - ne fonctionne toujours pas

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.

4
user981235

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

10
callisto

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);
6
user5159158

Téléchargement de fichiers

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>

AsyncFileUpload

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);
    }
}

D'autres pensées

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.

2
Win

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

2
Tran Anh Hien