FileUpload и UpdatePanel: ScriptManager. RegisterPostBackControl работает во второй раз

Я разрабатываю приложение 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);
}

Спасибо.

8
задан VansFannel 16 February 2010 в 09:01
поделиться

3 ответа

Для меня это решение сработало:

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

Атрибут enctype отсутствует при первой обратной передаче.

http://adamnoffie.blogspot.com/2007/10/file-upload-not-working-on-first.html

30
ответ дан 3 November 2019 в 12:49
поделиться

Для загрузки заполнения требуется полная публикация, а если вы используете панель обновления, она выполняет частичную обратную публикацию. Таким образом, сам по себе FileUpload работать не будет. Вам придется поступить иначе, вызвав RegisterPostBackControl .

Подробнее см. По этой ссылке -> http://geekswithblogs.net/mmintoff/archive/2009/04/01/fileupload-within-updatepanel.aspx

1
ответ дан 3 November 2019 в 12:49
поделиться

В ответ на ваше второе обновление,

у меня была именно эта проблема, и я считаю, что она делать с тем, что вы добавляете добавление динамического элемента управления на вашу страницу внутри 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

Я удалил много код, но он все равно должен дать общее представление:)

1
ответ дан 3 November 2019 в 12:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: