2010-02-15 14 views
7

Ich entwickle eine ASP.NET-Anwendung mit C# und Visual Studio 2008 SP1. Ich verwende WebForms.FileUpload und UpdatePanel: ScriptManager.RegisterPostBackControl funktioniert das zweite Mal

Ich habe eine ASPX-Seite mit zwei UpdatePanels, eine auf der linken Seite, die eine TreeView enthält und andere auf der rechten Seite, wo ich dynamisch Benutzersteuerelemente laden.

Ein Benutzer-Steuerelement, das ich auf der rechten Seite verwendet habe, verfügt über ein FileUpload-Steuerelement und eine Schaltfläche zum Speichern dieser Datei auf dem Server. Die ascx Code Steuerung zu speichern ist:

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

ich eine volle Postbacks, um die Datei auf den Server zu laden und es zu Datenbank speichern. Aber ich bekomme immer falsch auf FileUpload.HasFile.

I Problem ist das richtige UpdatePanel. Ich brauche es, um die Benutzersteuerelemente dynamisch zu laden. Dieses Panel verfügt über drei UpdatePanels zum Laden der drei Benutzersteuerelemente, die ich verwende.

Vielleicht kann ich einen Async File Uploader verwenden oder das richtige Update Panel löschen und ein komplettes Postback ausführen, um die Steuerelemente dynamisch zu laden.

Irgendwelche Ratschläge?
UPDATE:

RegisterPostBackControlarbeitet ... das zweite Mal, dass ich Schaltfläche Speichern klicken Sie auf. FileUpload.HasFile ist zum ersten Mal FALSE und das zweite Mal ist TRUE.

zweite Update
Auf den ersten Klick ich überprüfen ScriptManager.IsInAsyncPostBack auch und ist FALSCH. Ich verstehe nichts !!

Warum?

Der Code Benutzerkontrolle erstes Mal zu laden, und auf jedem Postback ist:

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); 
} 

Danke.

+0

Bump. Sie sollten eine dieser Antworten akzeptieren. –

Antwort

1

Fill Upload erfordert einen vollständigen Post, und wenn Sie ein Update Panel verwenden, wird es teilweise zurückversetzt. Also, FileUpload selbst wird nicht funktionieren. Sie müssen anders damit umgehen, indem Sie die RegisterPostBackControl aufrufen.

Siehe diesen Link für weitere Details ->http://geekswithblogs.net/mmintoff/archive/2009/04/01/fileupload-within-updatepanel.aspx

+0

Ok. Wie kann ich eine Schaltfläche in meinem Benutzersteuerelement von der Seite aus registrieren? Ich sehe, dass ich nur die Lochkontrolle registrieren kann. Stellen Sie sich vor, dass das Benutzersteuerelement MyUserControl ist und die Schaltfläche Speichern ist. Kann ich etwas wie ScriptManager1.RegisterPostBackControl (myUserControl.Save); Ich möchte nicht jedes Mal einen vollständigen Postback ausführen, wenn der Benutzer auf eine Schaltfläche dieses Benutzersteuerelements klickt. – VansFannel

+0

Ok, es funktioniert ... das zweite Mal klicke ich auf Speichern. Warum? – VansFannel

+0

Ich habe meine Frage aktualisiert. Ich mache einen vollständigen Postback, aber FileUpload funktioniert nicht. – VansFannel

1

Als Antwort auf Ihre zweite Update,

hatte ich genau dieses Problem, und ich glaube, dass es mit der Tatsache zu tun, dass Sie ein dynamischen hinzufügen steuere deine Seite innerhalb des UpdatePanels.

Vielleicht gibt es einen besseren Weg, es zu tun, da ich sicherlich kein ASP.NET-Experte bin, aber ich konnte dieses Problem selbst lösen, indem ich das Steuerelement in einem div hinzufügte, das mit CSS versteckt wurde - Vorher - es wurde benötigt, und dann die ID des "Dummy" -Steuerelements automatisch inkrementiert, so dass es keine Konflikte gibt, und ich kann so viele hinzufügen, wie ich möchte. Auf diese Weise erkennt das UpdatePanel, wenn es ausgelöst wird, die Steuerelemente und deren Inhalt vollständig, ausgenommen die versteckten.

Ich verwende XSL, um meine XML in eine dynamische Seite umzuwandeln, die ASP enthält.NET Kontrollen, so im Wesentlichen habe ich die folgenden:

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

Und dann in der Code-behind:

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 

ich viel des Codes ausgezogen, aber es sollte bekomme immer noch die übergreifende Idee :)

+0

Danke! Gute Antwort! – VansFannel

3

das Setzen Sie in Ihrem Formular-Tag folgende:

enctype = "multipart/form-data"

1

ich hier beide Ratschläge kombinieren musste. Ich verwende ein UpdatePanel, um ein UserControl dynamisch zu laden, und das FileUpload befindet sich in dem UserControl. Ich musste:

  • RegisterPostBackControl in der Page_Load Benutzersteuerung

  • hinzufügen enctype = "multipart/form-data" auf das Formular-Element der Seite, die den Update-Panel enthält, die Codepage. Form.Attributes.Add ("enctype", "multipart/form-data"); funktionierte nicht für mich, es musste in der aspx sein

Hoffe das hilft. nur

0

Es funktionierte für mich, wenn ich es in der Page_Init setzen

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 
    Page.Form.Attributes.Add("enctype", "multipart/form-data") 
End Sub 
Verwandte Themen