2009-08-10 42 views
8

tôi gặp sự cố.DropDownList trong UpdatePanel

trong dự án của tôi tôi đã đặt một danh sách thả xuống trong một updatepanel.what tôi muốn làm là chọn một giá trị từ danh sách thả xuống và sử dụng nó trong một phiên.

nhưng bất cứ điều gì tôi làm, nó sẽ luôn luôn cho tôi giá trị null vì không kiểm tra "Enable AutoPostBack" .và khi tôi làm điều này, nó sẽ làm mới trang vì vậy đây không phải là những gì tôi muốn.

làm cách nào tôi có thể giải quyết vấn đề này?

bất kỳ ý tưởng nào ...

Trả lời

19

Có vẻ như bạn có thể không sử dụng tính năng UpdatePanel đúng cách. Nếu bạn có UpdatePanel được đặt để cập nhật khi trẻ em kích hoạt sự kiện, chỉ UpdatePanel mới làm mới, không phải toàn bộ trang. Mã bên dưới dường như hoạt động tương tự như những gì bạn đang tìm kiếm. Khi thay đổi menu thả xuống, chỉ bảng cập nhật mới đăng lại máy chủ và khi bạn làm mới trang, bạn có thể lấy giá trị trong phiên.

ASPX MÃ

<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div> 
     Current Time: <asp:Label ID="lblTime" runat="server" /><br /> 
     Session Value: <asp:Label ID="lblSessionValue" runat="server" /><br /> 
     <br /> 
     <asp:UpdatePanel ID="upSetSession" runat="server"> 
      <ContentTemplate> 
       <asp:DropDownList ID="ddlMyList" runat="server" 
        onselectedindexchanged="ddlMyList_SelectedIndexChanged" 
        AutoPostBack="true"> 
        <asp:ListItem>Select One</asp:ListItem> 
        <asp:ListItem>Maybe</asp:ListItem> 
        <asp:ListItem>Yes</asp:ListItem> 
       </asp:DropDownList> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="ddlMyList" 
        EventName="SelectedIndexChanged" /> 
      </Triggers> 
     </asp:UpdatePanel> 
    </div> 
</form> 

mã sau

protected void Page_Load(object sender, EventArgs e) 
    { 
     this.lblTime.Text = DateTime.Now.ToShortTimeString(); 
     if (Session["MyValue"] != null) 
      this.lblSessionValue.Text = Session["MyValue"].ToString(); 
    } 

    protected void ddlMyList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Session.Remove("MyValue"); 
     Session.Add("MyValue", this.ddlMyList.SelectedValue); 
    } 
+0

oke bây giờ tôi tìm thấy một cách làm thế nào để giải quyết này tôi think.as tôi đã nói tôi tự động gọi là 7 tập tin ascx trong một updatepanel.if tôi sử dụng Nếu (IsPostBack) Sau đó, .... Kết thúc Nếu có lẽ tôi có thể làm cho nó làm việc – iersoy

+0

Tôi thường làm thêm nếu (IsPostback) kiểm tra xung quanh tải trang của tôi và chức năng trang init nếu họ có bất kỳ nội dung ... – RSolberg

+0

@RSolberg: Bạn đã cứu ngày của tôi !!! –

3

Để nhận bất kỳ thứ gì được lưu vào Phiên, bạn phải gửi nó đến máy chủ.

Có lẽ một số chi tiết khác về lý do bạn không muốn UpdatePanel làm mới sẽ hữu ích và những gì bạn đang cố gắng hoàn thành bằng cách sử dụng giá trị trong Phiên.

EDIT: Dựa trên nhận xét của bạn, có vẻ như với tôi giải pháp sẽ lưu trữ tệp .ascx hiện tại trong Phiên và đặt DropDownList của bạn để bật tự động khởi động.

Vì vậy, khi bạn xử lý các nút "Tiếp theo" và "Quay lại", hãy lưu chỉ báo cho đúng .ascx vào Phiên.

Trong khi xử lý postback của sự kiện thả xuống, bạn có thể chỉ cần đảm bảo rằng tệp .ascx hiện tại vẫn đang được hiển thị, bằng cách kiểm tra phiên để tệp chính xác hiển thị. Khi kết quả được trả về cho máy khách, không có gì sẽ thay đổi, vì UpdatePanel đủ thông minh để nhận ra đó là cùng một nội dung và bạn sẽ xử lý thành công với giá trị danh sách thả xuống.

+0

tôi cũng đã tạo ra một thuật sĩ như structure.and của nó rất phức tạp actually.but hãy để tôi nói u this.I có 7 ascx file và trong file default.aspx của tôi có ScriptManager và UpdatePanel.in updatepanel của tôi bằng cách sử dụng các nút Next và Back tôi gọi những tập tin .ascx này một cách linh hoạt để nó có một khung nhìn giống như wizard.if tôi tự động trả về danh sách thả xuống của mình nó sẽ quay trở lại webusercontrol thứ nhất có tên page1.ascx. điều này là không thể chấp nhận cho me.im cố gắng tìm một giải pháp nhưng không thể tìm thấy được – iersoy

+0

và bằng cách sử dụng phiên im lập kế hoạch để lưu trữ các biến toàn cục để sử dụng trong các tệp .ascx khác. – iersoy

+0

Tôi đã cập nhật câu trả lời của mình bằng một giải pháp khả thi cho bạn. – womp

1

Có vẻ như bạn đang làm việc hiệu quả hơn mức cần thiết ở đây. Bạn đã xem xét sử dụng ASP.NET Wizard Control chưa? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx hoặc chỉ Google.

Nếu bạn vẫn muốn làm theo cách của mình, bạn để gửi tới máy chủ (hoặc không có tự động khởi động + bấm nút gửi thủ công hoặc bằng cách bật tự động phát) vì Phiên là khái niệm phía máy chủ. HTTP là giao thức không trạng thái, do đó, khái niệm duy nhất về trạng thái phải được thực hiện bên ngoài miền của HTTP. Điều này có nghĩa là bạn đang mắc kẹt lưu trữ trạng thái trên máy chủ (ví dụ, trong phiên) hoặc, hạn chế hơn nhiều, trên máy tính của khách hàng (chẳng hạn như trong cookie).

+0

cảm ơn tôi sẽ nhìn vào nó. – iersoy

1

thanks a lot tôi giải quyết vấn đề bằng cách kiểm soát các biến trong sự kiện Page_Load.

If Label1.Text = 1 Then 
    Dim tempcontrol2 As Control = LoadControl("Page1.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 

ElseIf Label1.Text = 2 Then 
    Dim tempcontrol2 As Control = LoadControl("Page2.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 
End If 

cảm ơn u cho tất cả các câu trả lời