Я разрабатываю приложение ASP.NET с C# и Visual Studio 2008 SP1. Я использую WebForms.
У меня есть страница ASPX с двумя UpdatePanels, один слева, который содержит TreeView и другой справа, где я загружаю динамично пользовательские элементы управления.
Один пользовательский элемент управления, который я использовал на правильной панели, имеет контроль FileUpload и кнопку, чтобы сохранить тот файл на сервере. Код ascx для сохранения управления:
<asp:UpdatePanel ID="UpdatePanelBotons" runat="server" RenderMode="Inline"
UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="Save" runat="server" Text="Guardar"
onclick="Save_Click" CssClass="button" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="Save" />
</Triggers>
</asp:UpdatePanel>
Я делаю полную обратную передачу, чтобы загрузить файл на сервер и сохранить его к базе данных. Но я, всегда получая Ложь на FileUpload. HasFile.
Я проблема являюсь правильным UpdatePanel. Мне нужен он для загрузки динамично пользовательских элементов управления. Эта панель имеет три UpdatePanels для загрузки трех пользовательских элементов управления, которые я использую.
Возможно, я могу использовать Асинхронный Загрузчик Файла или удалить правильную Панель Обновления и сделать полную обратную передачу к управлению нагрузкой динамично.
Совет?
ОБНОВЛЕНИЕ:
RegisterPostBackControl
работы... во второй раз, когда я нажимаю, сохраняют кнопку. В первый раз FileUpload. HasFile является ЛОЖЬЮ, и вторым разом является TRUE.
Второе обновление
При первом щелчке я также проверяю ScriptManager. IsInAsyncPostBack и является ЛОЖЬЮ. Я НИЧЕГО не понимаю!!
Почему?
Код для загрузки пользовательского элемента управления в первый раз, и на каждой обратной передаче:
DynamicControls.CreateDestination ud =
this.LoadControl(ucUrl) as DynamicControls.CreateDestination;
if (ud != null)
{
Button save = ud.FindControl("Save") as Button;
if (save != null)
ScriptManager1.RegisterPostBackControl(save);
PanelDestination.Controls.Add(ud);
}
Спасибо.
Для меня это решение сработало:
добавить Page.Form.Attributes .Add ("enctype", "multipart / form-data");
Атрибут enctype отсутствует при первой обратной передаче.
http://adamnoffie.blogspot.com/2007/10/file-upload-not-working-on-first.html
Для загрузки заполнения требуется полная публикация, а если вы используете панель обновления, она выполняет частичную обратную публикацию. Таким образом, сам по себе FileUpload работать не будет. Вам придется поступить иначе, вызвав RegisterPostBackControl
.
Подробнее см. По этой ссылке -> http://geekswithblogs.net/mmintoff/archive/2009/04/01/fileupload-within-updatepanel.aspx
В ответ на ваше второе обновление,
у меня была именно эта проблема, и я считаю, что она делать с тем, что вы добавляете добавление динамического элемента управления на вашу страницу внутри UpdatePanel.
Возможно, есть лучший способ сделать это там, так как я, конечно, не эксперт по ASP.NET, но я смог решить эту проблему самостоятельно, добавив элемент управления в div, который был скрыт с помощью CSS -before - это было необходимо, а затем автоматически увеличивал ID «фиктивного» элемента управления, чтобы не было конфликтов, и я мог продолжать добавлять столько, сколько захочу. Таким образом, когда UpdatePanel запускается, он полностью распознает элементы управления и их содержимое, за исключением, конечно, скрытых.
Я использую XSL для преобразования своего XML в динамическую страницу, которая включает элементы управления ASP.NET, поэтому по существу я сделал следующее:
<div class="hide">
<asp:FileUpload CssClass="upload" identity="addVersion_{@id}_{count(draft) + 1}" runat="server" />
<asp:Button Text="Add File" identity="addVersionBtn_{@id}_{count(draft) + 1}" fileControlIdentity="addVersion_{@id}_{count(draft) + 1}" action="addVersion" runat="server" />
</div>
А затем в коде программной части:
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
//Code to generate the data (stripped out because it is generated in a different manner than the original poster)
//Add events for all of the new-found controls depending on their type
recursiveAddEvents(nameOfPlaceHolder.Controls)
End Sub
//Add events for all of the new-found controls depending on their type
Sub recursiveAddEvents(ByRef controls As ControlCollection)
For Each con As Control In controls
If con.Controls.Count > 0 Then
recursiveAddEvents(con.Controls)
End If
//Try to cast the control to different data types
Dim btn As Button = TryCast(con, Button)
Dim file As FileUpload = TryCast(con, FileUpload)
//Test to see which type the control was and apply the actions to it
If Not btn Is Nothing Then
//Assign the correct click events
If btn.Attributes.Item("action") = "addVersion" Then
AddHandler btn.Click, AddressOf addDraftVersion
btn.ID = btn.Attributes.Item("identity")
//Register the control with the ScriptManager
ScriptManager.GetCurrent(Page).RegisterPostBackControl(btn)
End If
ElseIf Not file Is Nothing Then
//Assign the correct click events
file.ID = file.Attributes.Item("identity")
End If
Next
End Sub
Protected Sub addDraftVersion(ByVal sender As Button, ByVal e As EventArgs)
Dim fileName as String = sender.Attributes("title").Replace(" ", "_") & "_D" & info("draftID") & "_V" & info("versionID")
Dim inputControl As FileUpload = TryCast(trackPH.FindControl(sender.Attributes("fileControlIdentity")), FileUpload)
If inputControl Is Nothing Then
Exit Sub
End If
//Do whatever need to be done
//Trigger UpdatePanel(s)
nameOfUpdatePanel.Update()
End Sub
Я удалил много код, но он все равно должен дать общее представление:)