2012-11-09 39 views
14

Tôi có một tình huống rất lạ nơi điều khiển Nhãn của tôi là NULL trong Page_Load. Nên nó có thể được?Kiểm soát máy chủ WebForms ASPNET là NULL trong Page_Load

Tôi có một mẫu Web:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MyNamespace.Templates.Pages.WebForm1" %> 
<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div style="background-color:yellowgreen;"> 
     FIRST 
    </div> 
    <div style="background-color: wheat;"> 
     SECOND 
     <cw:ArticleColumn runat="server" ID="ac" ArticleID="1899"/> 
    </div> 
    </form> 
</body> 
</html> 

Trong Page_Load của mẫu web, tôi chỉ cần làm một điều khiển ArticleColumn

if(!IsPostBack) DataBind(); 

Những thành viên trông như thế này:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleColumn.ascx.cs" Inherits="MyNamespace.Templates.Units.ArticleColumn" %> 
<h2><asp:Label runat="server" ID="myArticleHeading" Text="TOM" /></h2> 
<p><asp:Label runat="server" ID="myArticleIntro" Text="TOM" /></p> 
<asp:Label runat="server" ID="myArticleBody" Text="TOM" /> 

Và mã phía sau trông giống như sau:

public partial class ArticleColumn : UserControlBase<PageTypes.ArticleBase> 
{ 
    public int ArticleID { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var page = DataFactory.Instance.GetPage(new PageReference(ArticleID)); 

     myArticleHeading.Text = page.PageName; 
     myArticleIntro.Text = page.Property["IntroText"] != null 
          ? page.Property["IntroText"].ToWebString() 
          : string.Empty; 
     myArticleBody.Text = page.Property["MainBody"] != null 
          ? page.Property["MainBody"].ToWebString() 
          : string.Empty; 

     DataBind(); 
    } 
} 

Không thành công khi tôi cố gắng đặt myArticleHeading.Tiếp theo vì điều khiển là rỗng. Làm thế nào điều này thậm chí có thể? Các ASP.NET tự động ràng buộc của điều khiển phải có bằng cách nào đó đã thất bại ...

Tôi đã thử: - Khởi động lại VS 2010 - Switching xây dựng cấu hình - Vệ sinh/Xây dựng lại - tên Thay đổi của các điều khiển để các tập tin thiết kế là đã cập nhật.

Không cần phải nói, không có cách nào ở trên hiệu quả.

Edit: thêm stack trace:

[NullReferenceException: Object reference not set to an instance of an object.] 
    MyNamespace.Templates.Units.ArticleColumn.Page_Load(Object sender, EventArgs e) in C:\DevProjects\CustomerWeb\Main\Source\MyNamespace\Templates\Units\ArticleColumn.ascx.cs:21 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +91 
    System.Web.UI.Control.LoadRecursive() +74 
    System.Web.UI.Control.LoadRecursive() +146 
    System.Web.UI.Control.LoadRecursive() +146 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207 

Giải pháp: Tôi chỉ tìm thấy câu trả lời bản thân mình. Sử dụng tờ khai này cho usercontrol trên trang cố định vấn đề:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %> 

khai bị lỗi này được đưa vào sử dụng ReSharper menu chuột phải từ view html:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %> 

Thanks for the help! :)

+0

Tại sao bạn thực hiện cuộc gọi chung cho DataBind cả trên tải trang của biểu mẫu web và tải trang của người dùng kiểm soát? Trong thực tế, tại sao bạn gọi databind ở tất cả? Ngoài ra, bạn có thể vui lòng bao gồm dấu vết theo dõi ngoại lệ/ngăn xếp không? –

+0

Databinding là nỗ lực tuyệt vọng của tôi trong việc khắc phục vấn đề: S Sẽ thêm dấu vết ngăn xếp. –

+0

K, cho một. Loại bỏ các cuộc gọi DataBind() đó. Họ không làm gì cả. Thứ hai, trước myArticleHeading.Text = page.PageName; dòng, thêm này: string sTest = page.PageName; mục tiêu là để xác nhận rằng nó không phải là biến 'trang' là null. –

Trả lời

16

Tôi đã trả lời câu hỏi của mình ở trên.

Giải pháp: Tôi vừa tự tìm thấy câu trả lời.Sử dụng tờ khai này cho usercontrol trên trang cố định vấn đề:

<%@ Register TagPrefix="cw" TagName="ArticleColumn" Src="~/Templates/Units/ArticleColumn.ascx" %> 

khai bị lỗi này được đưa vào sử dụng ReSharper menu chuột phải từ view html:

<%@ Register TagPrefix="cw" Namespace="MyNamespace.Templates.Units" Assembly="MyNamespace" %> 

Thanks for the help! :)

+1

Chỉ cần một giải thích: bạn shold tải conrol theo đường dẫn, không phải bằng cách lắp ráp và không gian tên. Hãy cẩn thận với nó. –

+0

Tôi thấy rằng tôi đã phải đăng ký kiểm soát trong tập tin 'web.config' để nó hoạt động – drzaus

+1

Cảm ơn bạn! Tôi đã dành một giờ trong khi cố gắng tìm ra nguyên nhân của vấn đề của tôi, và tôi đã có thể chi tiêu nhiều hơn nếu không phải câu trả lời này :) –

0

Cập nhật nội dung của điều khiển người dùng từ trang.

Khai báo các thuộc tính trong điều khiển người dùng để cập nhật nội dung nhãn và sử dụng các thuộc tính đó từ trang có cá thể kiểm soát người dùng.

1

DataBind là một cái gì đó để ràng buộc các điều khiển được viết trong phần aspx với kịch bản phía máy chủ tức là <%%>.

Nhưng kịch bản của bạn không yêu cầu gọi databind(). Chỉ cần gán các giá trị cho các điều khiển sẽ hoạt động tốt.

Hãy thử xóa dữ liệu khỏi mã của bạn.

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