2012-11-09 19 views
14

Mam bardzo dziwną sytuację, w której moja kontrola Label ma wartość NULL w Page_Load. Czy to powinno być możliwe?Kontrola serwera WebForms ASPNET ma wartość NULL w Page_Load

Mam formularz WWW:

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

W Page_Load formularza WWW, ja po prostu zrobić kontrola ArticleColumn

if(!IsPostBack) DataBind(); 

Użytkownik wygląda następująco:

<%@ 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" /> 

Kod poniżej wygląda następująco:

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

Nie powiedzie się, gdy próbuję ustawić wartość myArticleHeading.Text, ponieważ kontrola ma wartość NULL. Jak to w ogóle jest możliwe? Programu ASP.NET automatycznego wiązania kontroli muszą jakoś udało ...

Próbowałem: - Ponowne uruchamianie VS 2010 - Switching budować konfiguracje - Czyszczenie/Przebudowa - zmiana nazwy kontroli tak, że plik jest projektant zaktualizowany.

Nie trzeba dodawać, że żadna z powyższych nie zadziałała.

Edit: dodano ślad stosu:

[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 

Rozwiązanie: Właśnie znalazłem odpowiedź siebie. Korzystanie z tej deklaracji dla usercontrol na stronie Naprawiono problem:

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

ten wadliwy deklaracja została dodana przy użyciu ReSharper prawym przyciskiem myszy menu z widoku html:

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

Dzięki za pomoc! :)

+0

Dlaczego generujesz ogólne wywołanie funkcji DataBind, zarówno na stronie ładowania strony internetowej, jak i podczas ładowania strony kontrolnej użytkownika? Dlaczego w ogóle dzwonisz do bazy danych? Czy możesz dołączyć ślad wyjątku/stosu? –

+0

Databinding to moja desperacka próba rozwiązania problemu: S Dodaje ślad stosu. –

+0

K, dla jednego. Pozbądź się tych wywołań DataBind(). Nic nie robią. Po drugie, przed myArticleHeading.Text = page.PageName; linii, dodaj to: string sTest = page.PageName; celem jest potwierdzenie, że nie jest to zmienna "strona", która ma wartość zerową. –

Odpowiedz

16

Odpowiedziałem na własne pytanie powyżej.

Rozwiązanie: sam znalazłem odpowiedź.Korzystanie z tej deklaracji dla usercontrol na stronie Naprawiono problem:

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

ten wadliwy deklaracja została dodana przy użyciu ReSharper prawym przyciskiem myszy menu z widoku html:

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

Dzięki za pomoc! :)

+1

Wystarczy wyjaśnienie: shold ładuje conrol po ścieżce, a nie po złożeniu i przestrzeni nazw. Ostrożnie z tym. –

+0

Zauważyłem, że muszę zarejestrować kontrolkę w pliku 'web.config' zamiast tego, aby zadziałało – drzaus

+1

Dziękuję! Spędziłem godzinę, próbując dojść do przyczyny mojego problemu, a ja spędziłbym więcej, jeśli nie tę odpowiedź :) –

0

Zaktualizuj zawartość formantu użytkownika ze strony.

Zadeklaruj właściwości w formancie użytkownika, aby zaktualizować zawartość etykiet i użyć ich na stronie z instancją kontroli użytkownika.

1

DataBind to coś, co wiąże elementy sterujące napisane w aspxie ze skryptem po stronie serwera, tj. <%%>.

Ale twój scenariusz nie wymaga wywoływania databind(). Po prostu przypisanie wartości do kontroli powinno działać dobrze.

Spróbuj poprzez usunięcie danych z kodu.