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, если мне нужно загрузить файл.