2010-02-15 30 views
7

Tôi đang phát triển một ứng dụng ASP.NET với C# và Visual Studio 2008 SP1. Tôi đang sử dụng WebForms.FileUpload và UpdatePanel: ScriptManager.RegisterPostBackControl hoạt động lần thứ hai

Tôi có một trang ASPX với hai UpdatePanels, một ở bên trái chứa TreeView và một ở bên phải nơi tôi tải các điều khiển người dùng động.

Một điều khiển người dùng, mà tôi đã sử dụng trên bảng điều khiển bên phải, có một điều khiển FileUpload và một nút để lưu tệp đó trên máy chủ. Mã ascx để lưu kiểm soát là:

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

Tôi thực hiện đăng lại đầy đủ để tải tệp lên máy chủ và lưu tệp vào cơ sở dữ liệu. Nhưng tôi luôn nhận được False trên FileUpload.HasFile.

Vấn đề của tôi là UpdatePanel phù hợp. Tôi cần nó để tự động điều khiển người dùng. Bảng điều khiển này có ba UpdatePanels để tải ba điều khiển người dùng mà tôi sử dụng.

Có thể tôi có thể sử dụng Trình tải lên tệp không đồng bộ hoặc xóa Bảng cập nhật phù hợp và thực hiện đăng lại đầy đủ để tải điều khiển động.

Bạn có lời khuyên nào không?
UPDATE:

RegisterPostBackControllàm việc ... lần thứ hai tôi bấm vào nút tiết kiệm. Lần đầu tiên FileUpload.HasFile là FALSE và lần thứ hai là TRUE.

Second Cập nhật
Khi được nhấp đầu tiên tôi cũng kiểm tra ScriptManager.IsInAsyncPostBack và là FALSE. Tôi không hiểu bất cứ điều gì !!

Tại sao?

Mã để tải điều khiển người dùng lần đầu tiên, và trên mỗi postback là:

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

Cảm ơn bạn.

+0

Bump. Bạn nên chấp nhận một trong những câu trả lời này. –

Trả lời

1

Điền vào Tải lên yêu cầu bài đăng đầy đủ và nếu bạn sử dụng Bảng điều khiển cập nhật, bài đăng một phần sẽ trở lại. Vì vậy, FileUpload của chính nó sẽ không hoạt động. Bạn sẽ phải xử lý nó một cách khác nhau bằng cách gọi số RegisterPostBackControl.

Xem liên kết này để biết chi tiết ->http://geekswithblogs.net/mmintoff/archive/2009/04/01/fileupload-within-updatepanel.aspx

+0

Ok. Làm thế nào tôi có thể đăng ký một nút bên trong điều khiển người dùng của tôi từ trang. Tôi thấy rằng tôi chỉ có thể đăng ký kiểm soát lỗ. Hãy tưởng tượng rằng điều khiển người dùng là myUserControl, và nút này là Save. Tôi có thể làm một cái gì đó như ScriptManager1.RegisterPostBackControl (myUserControl.Save); Tôi không muốn đăng lại toàn bộ mỗi lần người dùng nhấp vào nút từ điều khiển người dùng đó. – VansFannel

+0

Ok, nó hoạt động ... lần thứ hai tôi nhấp vào nút Lưu. Tại sao? – VansFannel

+0

Tôi đã cập nhật câu hỏi của mình. Tôi đang làm một postback đầy đủ nhưng FileUpload không hoạt động. – VansFannel

1

Để đối phó với bản cập nhật thứ hai của bạn,

Tôi có vấn đề này chính xác, và tôi tin rằng nó đã làm với thực tế là bạn đang thêm một động lực kiểm soát trang của bạn bên trong UpdatePanel.

Có thể có cách tốt hơn để làm điều đó, vì tôi chắc chắn không có chuyên gia ASP.NET, nhưng tôi có thể tự mình giải quyết vấn đề này bằng cách thêm điều khiển vào div bị ẩn bằng cách sử dụng CSS - trước đó - nó là cần thiết, và sau đó tự động tăng ID kiểm soát "giả" để không có xung đột, và tôi có thể tiếp tục thêm bao nhiêu tùy thích. Bằng cách đó, khi UpdatePanel được kích hoạt nó hoàn toàn nhận ra các điều khiển và nội dung của họ, ngoại trừ những điều ẩn trong khóa học.

Tôi đang sử dụng XSL để chuyển đổi XML của mình thành trang động bao gồm ASP.NET kiểm soát, vì vậy về cơ bản tôi đã làm như sau:

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

Và sau đó trong 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 

Tôi tước ra rất nhiều mã, nhưng nó nên vẫn nhận được ý tưởng chung qua :)

+0

Cảm ơn! Câu trả lời chính xác! – VansFannel

3

Đặt sau trong thẻ hình của bạn:

enctype = "multipart/form-data"

1

tôi phải kết hợp cả hai lời khuyên ở đây. Tôi đang sử dụng một UpdatePanel để tự động tải một UserControl và FileUpload là trong UserControl. Tôi phải:

  • RegisterPostBackControl trong Page_Load người dùng điều khiển của

  • thêm enctype = "multipart/form-data" để các yếu tố hình thức của trang, trong đó có bảng điều khiển cập nhật, mã trang. Form.Attributes.Add ("enctype", "multipart/form-data"); không hiệu quả đối với tôi, nó phải nằm trong aspx

Hy vọng điều này sẽ hữu ích.

0

Nó làm việc cho tôi, chỉ khi tôi đặt nó trong Page_Init

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 
    Page.Form.Attributes.Add("enctype", "multipart/form-data") 
End Sub 
Các vấn đề liên quan