2009-05-17 30 views
7

Có một sự khác biệt giữa hai kịch bản sau đây:Làm cách nào để truy cập các điều khiển bên trong trang cái lồng nhau? tại sao nó hoạt động khác với các trang nội dung?

(1) Truy cập vào một tài sản trên một trang chủ từ một đứa trẻ thường xuyên

(2) Truy cập vào một tài sản trên một trang chủ từ một trang chủ lồng nhau

tôi cố gắng để truy cập vào một textbox trong trang chủ từ một trang nội dung như thế này:

TextBox a; 
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive 
defaultTextbox.Text = a.Text; // defaultTextBox is a textbox control inside default.aspx 

nó hoạt động, nhưng sau đó khi tôi áp dụng phương pháp tương tự trên một trang chủ lồng nhau:

TextBox a; 
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive 
myTextBox.Text = a.Text; // myTextBox is a textbox control inside child.master 

điều này không có tác dụng, tôi có thiếu gì đó không? Tôi gọi cả hai mã bên trong điều khiển page_load handler ...

Tôi cũng nhận thấy rằng tôi không thể đặt giá trị hộp văn bản bên trong trang cái lồng nhau từ mã phía sau, chắc chắn có điều gì đó im mất tích, nó là gì? Để làm sáng tỏ vấn đề này, đây là một ví dụ:

Nested Master Page:

<%@ Master Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="false" CodeFile="MasterPage2.master.cs" Inherits="MasterPage2" %> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 

<asp:textbox id="tx2" runat="server" text="this is two"></asp:textbox> 
<asp:contentplaceholder id="newstuff" runat="server"></asp:contentplaceholder> 
</asp:Content> 

Mã đằng sau:

Response.Wrote(tx2.Text); 

tôi nhận được NOTHING, tại sao tôi đã bỏ lỡ những gì? lưu ý rằng tôi cũng đã cố gắng kiểm soát đệ quy tìm:

String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text; 

vẫn không có gì

Trả lời

4

Tôi đã đọc một vài điều ở đây: http://www.odetocode.com/Articles/450.aspx và phát hiện ra rằng trang lồng nhau ở giữa không bao giờ gọi Page_Load! thay vào đó, nó cháy một sự kiện tải mà bạn có thể nắm bắt để thiết lập bất cứ lĩnh vực, vì vậy câu trả lời là ở: trên trang lồng nhau làm như sau:

protected override void OnLoad(EventArgs e) 
    { 
     myTextBox.Text = "anything"; 
     base.OnLoad(e); 
    } 
+0

Nếu trang cái lồng nhau không gọi Page_Load, điều gì đó khác cũng sai vì tất cả các phương thức Page_Load nên được gọi (trên trang chính, trang cái lồng nhau và trang nội dung). Tôi đã thêm một số thông tin khác vào câu trả lời ban đầu của mình. –

2

này nên làm việc mà không cần bất kỳ vấn đề, vì vậy cái gì khác phải là sai. Tôi chỉ thử nó bên trong một dự án thử nghiệm đơn giản và tôi không gặp vấn đề gì khi tìm kiếm một điều khiển trên trang cái trong cả hai trường hợp.

Tôi sẽ kiểm tra (lại) nếu bạn tham khảo trang chính xác bên trong trang cái lồng nhau của bạn. Những gì bạn cũng có thể kiểm tra là kiểu thời gian chạy của thuộc tính Master bên trong trang cái lồng nhau của bạn. Nó phải là loại trang chủ của bạn.

EDIT: Tôi nghĩ rằng vấn đề là tìm một điều khiển trong trang cái gốc từ trang chính lồng nhau và điều này sẽ hoạt động mà không gặp bất kỳ sự cố nào. Để tìm điều khiển bên trong trình giữ chỗ nội dung trong trang cái lồng nhau, hãy xem forum post sau đây.

+0

tôi vừa tạo dự án mới từ đầu, tôi vẫn nhận được kết quả tương tự! Tôi không thể truy cập bất cứ điều gì trên trang lồng nhau giữa – Ayyash

+0

Tôi nghĩ câu hỏi của bạn là về việc truy cập các thuộc tính trên trang cái gốc từ cả trang cái lồng nhau và trang nội dung. Tôi sẽ thử và xem liệu tôi có thể làm cho otrher snenario hoạt động không: truy cập vào một thuộc tính trên một trang cái lồng nhau từ một trang nội dung. –

5
ContentPlaceHolder cp = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1"); 
    //base content place holder id 

Label objLabel3 = (Label)cp.FindControl("lblNested"); 
    //lblNested is id in nested master page 
0

Bạn có thể có quyền kiểm soát tuyệt đối của nội dung của bạn trong cả hai bậc thầy trang và trang lồng nhau từ trang nội dung của bạn bằng cách sử dụng các chỉ thị:

<%@ MasterType VirtualPath="your_master.master" %> 
<%@ Reference VirtualPath="~/your_master.master" %> 

Xem bài viết tuyệt vời từ K.Scott Allen ở Ode To Code

Các vấn đề liên quan