1

UserControl で UpdatePanel を使用したいと思います。問題は、コントロールがドロップされる .aspx ページに ScriptManager がないことです。UserControl に ScriptManager を作成する必要があります。ただし、UserControl がページ上で 2 回使用されている場合、ScriptManager の初期化は 1 回しかできないため、ScriptManager の配置は機能しません。

ScriptManager が必要な他の UserControls (私は AJAX Toolkit Extensions を使用していました) では、次のコードを使用できました。

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    Page.Init += new EventHandler(Page_Init);
}

void Page_Init(object sender, EventArgs e)
{
    if (Page.Form != null && ScriptManager.GetCurrent(Page) == null)
        Page.Form.Controls.AddAt(0, new ScriptManager());
}

..うまくいきましたが、UpdatePanelの場合はそうではありませんでした。

マスターページを使用していないことに注意してください

(私が考えていた別の方法は、UpdatePanel 内に UserControl をプログラムで作成することです。)

4

5 に答える 5

0

私はこれと同じ問題に直面しています。問題は、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にはすでに十分なレベルの肥大化があるように見えるので、それは良い考えではないようです...

于 2009-07-29T10:11:10.000 に答える
0

うまくいかない理由は何ですか?ScriptManager が必要であるという UpdatePanel から例外が発生していますか? System.Web.Extensions 1.0 または 3.5 を使用していますか? 3.5 で UpdatePanel に変更が加えられたため、そのコンテンツ テンプレートが OnInit の前にインスタンス化されるため、それが機能しない明確な理由はわかりません。例外がある場合は、スタック トレースを確認すると役立ちます。

于 2009-07-16T18:22:41.730 に答える
0

私はこれが可能だとは思わない。私はそれをいくつかの異なる方法で試しました。思い切ってスクリプトマネージャをページに追加する必要があるかもしれません。

于 2009-07-09T22:09:59.650 に答える
0

ページに ScriptManager が存在しない場合に ScriptManager を動的に追加する代わりに、単純に反対のことを行います。ScriptManager を ASCX に追加し、ページに既に存在する場合は削除します。そう...

protected override void OnInit(EventArgs e) {
    base.OnInit(e);
    AdjustScriptManager();
}

private void AdjustScriptManager() {
    if (ScriptManager.GetCurrent(Page) != null) {
        ScriptManager1 = null;
    }
}

アップデート:

いいえ、さらにテストした後、これは機能しません。ScriptManager1 = null は役に立たないからです。これを行う (またはページ コントロールを削除する) 方法がある場合は、コメントしてください。

于 2013-01-16T00:07:04.773 に答える
-1

解決策:現在のページに ScriptManager がまだ含まれていないかどうかを確認することで、usercontrol に scriptmanager を動的に追加できます。方法は次のとおりです:)

UserControl (ascx) html に次のように記述します。

<asp:PlaceHolder ID="pHolder" runat="server" />

コードビハインド (ascx.cs):

    //insert Scriptmanager dynamically only IF it does not already exist
     private void createScriptManager(System.EventArgs e)
    {
        // the GetCurrent() method will return a ScriptManager from the Page
        if (System.Web.UI.AjaxScriptManager.GetCurrent(this.Page) == null)
        {
            System.Web.UI.AjaxScriptManager manager = new System.Web.UI.AjaxScriptManager();
            manager.EnablePartialRendering = true;
            pHolder.Controls.Add(manager);
        }
    }

    // call the above method from the usercontrol's OnInit
    override protected void OnInit(EventArgs e)
    {
        //
        // CODEGEN: This call is required by the ASP.NET Web Form Designer.
        //
        createScriptManager(e);
        base.OnInit(e);
    }

ScriptManager を動的に定義する必要がある場合があります。私の場合、別のページに配置されるユーザーコントロールを使用していますが、これらのページには既に ScriptManager が含まれているページと含まれていないページがあります。上記のコードの優れた点は、ページにまだスクリプト マネージャーがない場合にのみ、ユーザー コントロールがスクリプト マネージャーを追加することです。

注: 古いバージョンの Ajax を使用している場合は、System.Web.UI.AjaxScriptManager を System.Web.UI.ScriptManager に置き換えることができます。

于 2010-11-26T08:08:11.917 に答える