2009-05-21 22 views
5

Tôi đã kiểm soát người dùng có chứa asp: Literal.asp: Kiểm soát văn bản null trong điều khiển người dùng

<div> 
    <asp:Literal id="MenuContainer" runat="server" /> 
</div> 

Có một phương pháp trong code-behind trang mà khởi sự kiểm soát:

internal void Setup(MyBusinessObject obj) 
{ 
    MenuObject menu = MenuHelper.GetMenu(obj.State); 

    if(obj == null) 
     MenuContainer.Visible = false; 

    //other code 
} 

Trong trang nơi điều khiển được sử dụng tôi gọi Cài đặt phương pháp kiểm soát trong LoadComplete handler sự kiện (Lần đầu tiên tôi gọi nó là Tải sự kiện). Không phân biệt MyBusinessObject là null hoặc không null, khi tôi truy cập Literal trên người dùng kiểm soát tôi nhận được lỗi:

Object reference not set to an instance of an object. 

lý do là gì và biện pháp khắc phục là những gì cho việc này?

+0

Nó hoạt động tốt cho tôi tho. Có thể có một số vấn đề khác. Hãy thử biên dịch toàn bộ trang web. Và bằng cách này, bạn có thể truy cập các điều khiển khác trong điều khiển người dùng đó đúng cách không? – Kirtan

+0

Trên thực tế đây là điều khiển duy nhất trong người dùng-contorl – TheVillageIdiot

Trả lời

11

Nó rất đơn giản. Tôi đã thêm những thứ trong phần điều khiển của web.config như đã được đề xuất bởi Rick Sthral trong một bài đăng của anh ấy (:(để nhận bài đăng, bạn sẽ phải tìm kiếm trên trang của mình).

Thật tuyệt vời cho phép tôi thêm kiểm soát mà không cần đặt @ Đăng ký từ khóa nhưng nhược điểm là điều khiển con trên các điều khiển của tôi được hiển thị là null!vì vậy tôi chỉ cần đặt @ Đăng ký chỉ thị trong các trang của tôi và nó hoạt động.

+0

+1, cảm ơn! Mặc dù bất cứ ai có thể giải thích giải pháp vô nghĩa này? Không phải phím tắt web.config phải loại bỏ nhu cầu xả rác đánh dấu trang bằng chỉ thị Đăng ký? Tại sao ngay cả bận tâm nếu chúng ta phải đặt nó ở đó để ngăn chặn lạ, tóc-kéo ra lỗi như thế này? Ok,. –

+0

@ Yadyn đó là điều tôi không thể hiểu được. Tôi đã bình luận trên blog của Rick nhưng chưa có câu trả lời nào. – TheVillageIdiot

0

Bạn có chắc chắn MenuContainer là sự cố không? Bạn đang tham chiếu obj.State trong dòng đầu tiên của hàm Setup. Nếu điều đó obj là null bạn sẽ nhận được lỗi đó.

+0

Có, đó là vấn đề. nếu (obj == null) vượt qua. MenuContainer.Visible ném ngoại lệ. – TheVillageIdiot

0

Như đã đề cập trong câu trả lời của JerSchneid, nếu obj là null, bạn sẽ nhận được lỗi đó. Vì vậy, hãy thử làm như thế này -

internal void Setup(MyBusinessObject obj) 
{ 
    if(obj == null) 
     MenuContainer.Visible = false; 
    else 
     MenuObject menu = MenuHelper.GetMenu(obj.State); 
} 

EDIT: Tôi biết bạn đang gặp lỗi trên dòng đó, nhưng chỉ cần thử làm như thế này. Hoặc, nếu không, hãy xóa toàn bộ mã và chỉ giữ dòng MenuContainer.Visible = false;.

+0

Kính gửi obj không phải là null chỉ MenuContainer là null. Đó là lý do tại sao tôi bối rối. – TheVillageIdiot

0

Nếu MenuContainer là null, có thể có gì đó liên quan đến dòng thời gian của vòng đời trang. Bạn đang gọi hàm đó trước khi MenuContainer được liên kết. Bạn có thể thử gọi Setup trong chức năng Page_Load không?

0

Mã bạn được đăng như sau:

internal void Setup(MyBusinessObject obj) 
{  
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
  • Nếu obj là null, sau đó dereferencing obj.State trên dòng đầu tiên sẽ ném một NullReferenceException

  • Nếu obj không phải là null , dòng MenuContainer.Visible = false sẽ không được thực thi.

Vì vậy, tôi không nghĩ rằng bạn đang đăng tất cả mã có liên quan.

Khi bạn gặp khó khăn gỡ lỗi loại điều, cố gắng bước qua đoạn code với trình gỡ rối hoặc thêm một số khẳng định mã của bạn, mà sẽ giúp bạn để xem chính xác những gì đang xảy ra:

internal void Setup(MyBusinessObject obj) 
{  
    Debug.Assert(obj != null); 
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    Debug.Assert(MenuContainer != null); 
    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
1

Cảm ơn, TheVillageIdiot, đã đăng câu trả lời cho vấn đề của bạn - Tôi đã hiểu chính xác cùng một sự hiểu lầm.

Thêm điều khiển qua

<add tagPrefix="user" namespace="Frontend.Web.UserControlsAccount" assembly="Frontend.Web" /> 

trong web.config là không đủ để thực sự sử dụng nó! Tôi đã thử nó như thế này trên một trang:

<user:ucLoginMessages runat="server" ID="Msgs" /> 

... nhưng điều này sẽ dẫn đến hiện tượng này, rằng không ai trong số các điều khiển bên trong UserControl được khởi tạo. Chỉ thêm

<%@ Register Src="~/UserControlsAccount/LoginMessages.ascx" TagPrefix="user" TagName="Messages" %> 

để phía trên cùng của trang giải quyết vấn đề :-)

Cảm ơn một lần nữa!

5

Tùy thuộc vào chính xác cách bạn bao gồm các điều khiển trong web.config của mình. Nó sẽ không hoạt động nếu bạn cố gắng để bao gồm tất cả các điều khiển trong một không gian tên (mặc dù các nhà thiết kế sẽ chính xác cho bạn thấy danh sách các điều khiển của bạn):

<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" /> 

Nhưng nếu bạn thêm điều khiển của bạn (s) cá nhân và điểm đến (các) vị trí thực của chúng, nó sẽ hoạt động như bạn mong đợi mà không cần phải bao gồm các chỉ thị bất tận @Register.

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" /> 
Các vấn đề liên quan