c# asp.net file-upload

c# - ASP.NET FileUpload en UpdatePanel-todavía no funciona



file-upload (4)

Subir archivo

FileUpload requiere una solicitud de página completa. Esta es una limitación del componente XmlHttpRequest utilizado en todos los marcos AJAX para llamadas asíncronas a la aplicación.

Lo que realmente me sorprende es que tengo esto funcionando en otro proyecto (scriptmanager en la página maestra, Fileupload en el panel de actualización, SaveButton es PostbackTrigger).

Creo que está utilizando Full PostBack, aunque FileUpload está dentro ** UpdatePanel .

Por ejemplo,

<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 usa AsyncFileUpload con UpdatePanel , AsyncFileUpload.HasFile solo debería verificarse dentro de UploadedComplete (no puede marcar dentro del evento de clic del botón) .

La razón es que AsyncFileUpload carga el archivo a través de Async por sí mismo.

Nota: asegúrese de usar ToolkitScriptManager en lugar 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); } }

otros pensamientos

Personalmente no me gusta usar AsyncFileUpload dentro de UpdatePanel . En cambio, prefiero usar Full PostBack si necesito cargar un archivo.

Intentar utilizar un control FileUpload o AsyncFileUpload en un panel de actualización en una aplicación web NET 4.5 / C #.

Intenté usar Scriptmanager estándar o ToolKitScriptManager en mi página maestra.

Mi botón Guardar está configurado como PostBackTrigger (también probé AsyncPostbackTrigger).

No importa qué, mi (Async) FileUpload.HasFile siempre devuelve falso.

Elimine el panel de actualización y ambos controles de carga funcionan bien.

Lo que realmente me sorprende es que tengo esto funcionando en otro proyecto (scriptmanager en la página maestra, Fileupload en el panel de actualización, SaveButton es PostbackTrigger).

¿Existe alguna versión específica de AJAX o versión .NET que pueda causar problemas?

Esto es extremadamente frustrante.


Al agregar el botón a la etiqueta de activación del UpdatePanel, lo hice funcionar:

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

No tuve que hacer nada diferente del lado del servidor (como la respuesta del usuario 5159158).


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


La carga de archivos no funcionará con una publicación parcial posterior. Requiere solicitud de página completa. Por lo tanto, agregue la línea a continuación en la carga de su página.

ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);