私はこれと同じ問題に直面しています。問題は、OnInitステージの前にscriptmanagerを追加する必要があることです。私が見る限り、preinitステージでスクリプトマネージャーを追加する必要があります。これは、オーバーライドの負荷を追加することで確認できます。ページがpreinit okを通過し、addedcontrolイベントに移動したところ、「スクリプトマネージャーが必要です。 「投げられます。WUCにはPreInitイベントがないため、子ユーザーコントロールからPage.PreInitイベントにイベントハンドラーを追加する方法を見つけるのに苦労しています。WUCコンストラクターでさえ、そのポイントの前に起動せず、コンストラクターではページオブジェクトがnullであるため、そこに追加することはできません。WUCのAttachedControlステージでも、メインページにアクセスできないようです(ScriptManager oSCM=ScriptManager。GetCurrent(ページ); nullを返す)ので、エラーがスローされる前に、必要に応じてscriptmanagerを追加できないようです。
/ edit:-私が見る限り(そしてasp.netフォーラムでこれに対する答えはありませんでした-驚き、驚き)WUCは、親のpreinitステージが終了するまで、そのメソッド/イベントを開始しません。 、これを行うには2つの方法があります。
1)これを行う方法は、scriptmanagerを必要とするデザイナにコンテンツを配置せず、そのようなコンテンツを配置する必要がある場所にプレースホルダーを配置することです。次に、wucロードで、ScriptManager.GetCurrentを使用して、すでに存在するかどうかを確認し、存在しない場合は作成します。次に、SCMを必要とするコンテンツを動的に追加します。このようなもの:-
<%@ Control Language = "C#" AutoEventWireup = "true" CodeFile = "wucTestExample.ascx.cs" Inherits = "wucTestExample"%>
<asp:PlaceHolder ID = "plcAJAX" runat = "server" />
<asp:Label ID = "lblGeneral" runat = "server" Text="これは別のラベルです"/>
----------------コードビハインド---------------------------
システムを使用する;
System.Collections.Genericを使用します。
System.Linqを使用します。
System.Webを使用します。
System.Web.UIを使用します。
System.Web.UI.WebControlsを使用します。
パブリック部分クラスwucTestExample:System.Web.UI.UserControl
{{
保護されたvoidPage_Load(オブジェクト送信者、EventArgs e)
{{
ScriptManager oSCM = ScriptManager.GetCurrent(this.Page);
if(oSCM == null)
{{
oSCM = new ScriptManager();
oSCM.ID = "scmAJAX";
oSCM.EnablePartialRendering = true;
this.plcAJAX.Controls.AddAt(0、oSCM);
}
UpdatePanel udpMain = new UpdatePanel();
udpMain.ID = "udpMain";
TextBox txtMain = new TextBox();
txtMain.ID = "txtMain";
//ここに他の属性
ボタンbtnPostback=new Button();
btnPostback.ID = "btnPostback";
btnPostback.Click + = new EventHandler(btnPostback_Click);
btnPostback.Text="部分的なポストバック";
ラベルlblPostback=new Label();
lblPostback.ID = "lblPostback";
lblPostback.Text="初期ポストバック";
udpMain.ContentTemplateContainer.Controls.Add(txtMain);
udpMain.ContentTemplateContainer.Controls.Add(btnPostback);
udpMain.ContentTemplateContainer.Controls.Add(lblPostback);
this.plcAJAX.Controls.Add(udpMain);
}
void btnPostback_Click(object sender、EventArgs e)
{{
//ここにボタンコードを実装します
ラベルlblPostback=(Label)this.plcAJAX.FindControl( "lblPostback");
if(lblPostback!= null)
{{
lblPostback.Text = String.Format( "WUC POstback at:{0}"、DateTime.Now.ToLongTimeString());
}
}
}
次に、このように使用します:-
<%@ Page Title = "" Language = "C#" MasterPageFile = "〜/ MasterPage.master" AutoEventWireup = "true" CodeFile = "TestExampleNoSCM.aspx.cs" Inherits = "TestExampleNoSCM"%>
<%@ Register Src = "〜/ wucTestExample.ascx" TagName = "wucTestExample" TagPrefix = "ucTE"%>
<asp:Content ID = "Content1" ContentPlaceHolderID = "head" Runat = "Server">
</ asp:コンテンツ>
<asp:Content ID = "Content2" ContentPlaceHolderID = "ContentPlaceHolder1" Runat = "Server">
<%-<asp:ScriptManager ID = "scmAJAX" runat = "server" />-%>
<asp:Label ID = "lblLoadTime" runat = "server" />
<ucTE:wucTestExample ID = "wucTestExample" runat = "server" />
</ asp:コンテンツ>
----------------コードビハインド---------------------------
システムを使用する;
System.Collections.Genericを使用します。
System.Linqを使用します。
System.Webを使用します。
System.Web.UIを使用します。
System.Web.UI.WebControlsを使用します。
パブリック部分クラスTestExampleNoSCM:System.Web.UI.Page
{{
保護されたvoidPage_Load(オブジェクト送信者、EventArgs e)
{{
this.lblLoadTime.Text = String.Format( "Page load at:{0}"、DateTime.Now.ToLongTimeString());
}
}
したがって、親ページでSCMにコメントを付けたり、コメントを外したりしても、WUCはどちらの方法でも機能します。
2)更新パネルが必要で、プログラマーがデザイナーですべてのコントロールを作成し、ページの読み込みでそれらをループする別のオプションを見ました(必要に応じて、SCMとUDPを作成し、すべてのコントロールを追加した後) WUC UDPで、それをプレースホルダーに追加する前に、これは二重にインスタンス化された制御であるように思われるので、かなり危険です。
方法1の欠点は、更新パネルですべてをプログラムで作成する方が手間がかかることですが、本当に自己依存型のWUCを作成したい場合は、それが価格のようです(そして、うまくいけば、WUCはそれほど複雑ではないはずです。とりあえず)。個人的には、私のアプリでは(WUCはアプリの外部では使用されないため)、メインページの必要な場所にSCMを追加するようにします。
もう1つ、最後に、私が提案することに注意してください-「マスターページに追加する」と言われているのを見たことがあります-これは、アプリのすべてのページにSCMが追加される場合を除いて、特に悪い考えのようです。あなたのページにまったく新しいレベルの肥大化がありますが、ASP.NETにはすでに十分なレベルの肥大化があるように見えるので、それは良い考えではないようです...