В моем ASP.NET .NET 3.5 у меня есть настраиваемый элемент управления, внутри которого есть UpdatePanel.
На этой панели обновлений я управляю мастером с 7 шагами.
На втором шаге я хочу загрузить вложения с помощью AsyncFileUpload.
В моем сценарии пользователь может добавить несколько файлов, и они будут отображаться внутри сетки, поэтому после загрузки он может добавлять к ним комментарии.
Все работает, файл, если у меня есть AsyncFileUpload в шаге, который виден в начале, событие UploadedComplete запускается правильно , но когда я начинаю с другого шага, я не могу заставить эту загрузку работать.
Я думал об использовании iframe, но хотел бы избежать этого, потому что мне нужно иметь 5 загружаемых компонентов на разных этапах.
Можно ли заставить этот AsyncFileUpload работать в мастере?
Мой код стандартный, на данный момент ничего волшебного:
ToolkitScriptManager
UpdatePanel
-ContentTemplate
--Wizard
--- WizardSteps
---- WizardStep 1
---- WizardStep 2
----- AsyncFileUpload
---- WizardStep 3
---- WizardStep 4
----- AsyncFileUpload 1
----- AsyncFileUpload 2
---- WizardStep 5
И мой простой обработчик событий
protected void AsyncFileUpload1_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{
var fileUpload = (AjaxControlToolkit.AsyncFileUpload)sender;
if (fileUpload.HasFile)
{
string strPath = path + e.FileName;
AsyncFileUpload1.SaveAs(strPath);
}
}
Как я уже писал ранее, я получаю это событие, если начну с шага 2 (ActiveStepIndex = 1).
Вот мой код ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="PWS_Test.ascx.cs" Inherits="kontrolki_PWS_Test" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Wizard ID="Wizard1" runat="server" ActiveStepIndex="0">
<WizardSteps>
<asp:WizardStep runat="server" title="Step 1">
<asp:Label ID="Label1" runat="server" Text="Questions"></asp:Label>
<br/>
<asp:CheckBox ID="CheckBox1" runat="server" Text="One"/>
<br/>
<asp:CheckBox ID="CheckBox2" runat="server" Text="Two"/>
</asp:WizardStep>
<asp:WizardStep runat="server" title="Step 2">
<asp:Label ID="Label2" runat="server" Text="Choose Your image"></asp:Label>
<br />
<asp:AsyncFileUpload ID="AsyncFileUpload1" runat="server" FailedValidation="False" OnUploadedComplete="AsyncFileUpload1_UploadedComplete" />
</asp:WizardStep>
</WizardSteps>
</asp:Wizard>
</ContentTemplate>
</asp:UpdatePanel>
А вот код cs:
using System;
public partial class kontrolki_PWS_Test : System.Web.UI.UserControl
{
protected const string path = @"c:\temp\";
protected void Page_Load(object sender, EventArgs e)
{
}
protected void AsyncFileUpload1_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{
var fileUpload = (AjaxControlToolkit.AsyncFileUpload)sender;
if (fileUpload.HasFile)
{
string strPath = path + e.FileName;
AsyncFileUpload1.SaveAs(strPath);
}
}
}
Это работает, когда я начинаю с шага 2.
В качестве обходного пути я создал скрытый div в моем элементе управления непосредственно перед мастером:
<div style="display: none">
<asp:AsyncFileUpload ID="AsyncFileUpload2" runat="server" />
</div>
и теперь моя загрузка работает, но мне нужно обычное решение вместо этого обходного пути.