2012-11-09 10 views
14

私のLabelコントロールがPage_LoadでNULLであるという非常に奇妙な状況があります。それは可能ですべきか?ASPNET WebForms Server ControlがPage_LoadでNULLになっています

私はWebフォームがあります。

<%@ 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" /> 
:WebフォームのPage_Loadので

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

を、私は単に

if(!IsPostBack) DataBind(); 

を行うユーザ制御ArticleColumnは次のようになります

コードは次のようになります:

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

コントロールがnullのためmyArticleHeading.Textを設定しようとすると失敗します。これはどのように可能ですか?コントロールのASP.NET自動バインディングは、何らかの形で失敗している必要があります...

私が試してみました: - 再起動VS 2010 - 構成 を構築切り替え - を再構築/クリーニングは - デザイナーのファイルがあるように、コントロールの名前を変更します更新しました。

言うまでもなく、上記のいずれも機能しませんでした。

編集:追加スタックトレース:

[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 

ソリューション: 私は答えを自分自身を発見しました。問題を修正しました]ページで、ユーザーコントロールのために、この宣言を使用する:

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

この障害のある宣言は、HTMLビューからReSharperの右クリックメニューを使用して追加されました。助けを

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

感謝を! :)

+0

なぜ、Webフォームのページの読み込みとユーザーコントロールのページの読み込みの両方でDataBindを汎用呼び出しをしていますか?実際に、なぜあなたはdatabindをまったく呼びますか?また、例外/スタックトレースを含めてください。 –

+0

データバインディングは、問題を解決するための私の必死の試みです:Sスタックトレースを追加します。 –

+0

K、1つです。それらのDataBind()呼び出しを取り除く。彼らは何もしていない。次に、myArticleHeading.Text = page.PageNameの前に。これを追加してください:string sTest = page.PageName;目標はnullである 'page'変数ではないことを確認することです。 –

答えて

16

私は上記の自分の質問に答えました。

解決方法:私は自分自身で答えを見つけました。問題を修正しました]ページで、ユーザーコントロールのために、この宣言を使用する:

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

この障害のある宣言は、HTMLビューからReSharperの右クリックメニューを使用して追加されました。助けを

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

感謝を! :)

+1

ちょうど説明:アセンブリと名前空間ではなく、パスで負荷の制御を売ります。それには注意してください。 –

+0

私は、代わりに 'web.config'ファイルにコントロールを登録しなければならないことがわかりました – drzaus

+1

ありがとう!私は問題の原因を突きつけようとしているうちに1時間を過ごしました。そして、私はこの答えではない場合にもっと費やしたでしょう:) –

0

ページからユーザーコントロールの内容を更新します。

ユーザーコントロールのプロパティを宣言して、ラベルコンテンツを更新し、ユーザーコントロールインスタンスでページのプロパティを使用します。

1

DataBindは、サーバー側のスクリプト、すなわち< %%>でaspxの部分で書かれたコントロールをバインドするものです。

しかし、シナリオではdatabind()を呼び出す必要はありません。コントロールに値を代入するだけでうまくいくはずです。

コードからdatabindを削除してみてください。

関連する問題