ASP.NET FileUpload в UpdatePanel - все еще не работает

Попытка использовать элемент управления FileUpload или AsyncFileUpload в панели обновления в веб-приложении NET 4.5/C#.

Я попытался использовать либо стандартный Scriptmanager, либо ToolKitScriptManager на моей главной странице.

Моя кнопка Сохранить установлена ​​как PostBackTrigger (пробовал AsyncPostbackTrigger тоже).

Независимо от того, что мой (Async)FileUpload.HasFile всегда возвращает false.

Удалите панель обновления, и оба элемента управления загрузкой работают нормально.

Что действительно меня бросает, так это то, что у меня это работает в другом проекте (скрипт-менеджер на главной странице, Fileupload на панели обновления, SaveButton - это PostbackTrigger).

Существует ли какая-то конкретная версия AJAX или.NET, которая может вызвать проблемы?

Это очень расстраивает.

4 ответа

Добавив кнопку в тэг триггера UpdatePanel, я заработал:

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

Мне не нужно было делать что-то другое на стороне сервера (как ответ пользователя user5159158).

В Page_Load добавьте: Page.Form.Attributes.Add("enctype", "multipart/form-data");

Загрузка файла не будет работать с частичной обратной записью. Требуется полный запрос страницы. Так что добавьте ниже строку в вашей странице загрузки.

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

Файл загружен

FileUpload требует полного запроса страницы. Это ограничение компонента XmlHttpRequest, используемого во всех инфраструктурах AJAX для асинхронных вызовов приложения.

Что действительно меня бросает, так это то, что у меня это работает в другом проекте (скрипт-менеджер на главной странице, Fileupload на панели обновления, SaveButton - это PostbackTrigger).

Я думаю, что вы используете Full PostBack, хотя FileUpload находится внутри ** UpdatePanel.

Например,

<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

Если вы используете AsyncFileUpload с UpdatePanel, AsyncFileUpload.HasFile следует проверять только внутри UploadedComplete (вы не можете проверить внутри события нажатия кнопки).

Причина в том, что AsyncFileUpload сам загружает файл через Async.

Примечание: убедитесь, что вы используете ToolkitScriptManager вместо 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);
    }
}

другие мысли

Мне лично не нравится использовать AsyncFileUpload внутри UpdatePanel. Вместо этого я предпочитаю использовать Full PostBack, если мне нужно загрузить файл.

Другие вопросы по тегам