1

ページとユーザーコントロールの両方からWebサイトにポップアップを表示する静的メソッドを作成しました。このメソッドは、ページにスクリプトマネージャーまたは更新パネルがあるかどうかを気にしません。

現時点では、メソッドは次の場所で正しく機能します。

  • ページの読み込み
  • ページPreRender
  • ページイベントハンドラー(OnClick、OnSelectedIndexChangedなど)
  • UserControlロード
  • UserControl PreRender

メソッドは失敗します:

  • UserControlイベントハンドラー(OnClick、OnSelectedIndexChangedなど)

これらのリストはどちらも使い果たされていません。

最も奇妙な部分は、メソッドがユーザーコントロールのロードイベントとプリレンダリングイベントで機能し、OnClickイベントで失敗することです。

静的コードは次のとおりです。

    private static Page CurrentPage
    {
        get
        {
            try
            {
                return (Page)HttpContext.Current.Handler;
            }
            catch
            {
                return null;
            }
        }
    }

    public static void ShowMessage(String Heading, String Message, String RedirectURL, Boolean AllowHTML)
    {
        if (CurrentPage != null)
        {
            try
            {
                String Script = "ShowCtMessagePopup('" + Heading + "', '" + Message + "', " + AllowHTML.ToString().ToLower() + ", " + (String.IsNullOrWhiteSpace(URL) ? "null" : "'" + URL + "'") + ");";

                try
                {
                    ScriptManager sm = ScriptManager.GetCurrent(CurrentPage);

                    if (sm == null || sm.IsInAsyncPostBack)
                        CurrentPage.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "ErrorMessage", Script.ToString(), true);
                    else
                        CurrentPage.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "ErrorMessage", "Sys.Application.add_load(function (){" + Script.ToString() + "});", true);
                }
                catch
                {
                    //trouble finding script manager
                    CurrentPage.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "ErrorMessage", Script.ToString(), true);
                }
            }
            catch
            {
                //ignore failed displays for now
            }
        }
    }

発信コードは次のとおりです。

<asp:Button ID="btValidate" runat="server" OnClick="btValidate_Click" Text="Validate" Width="125px" CssClass="formButton" />

protected void btValidate_Click(object sender, EventArgs e)
{
    CtMessagePopup.ShowMessage("Hello", "There", null, false);
}
4

1 に答える 1

4

この問題の解決策は、次のコードを使用することです。

Control Caller = this; //the user control that you are calling from
ScriptManager.RegisterStartupScript(Caller, typeof(Caller), "Script Name", Script.ToString(), true);

スクリプトマネージャーは、ユーザーコントロールからPageオブジェクトにスクリプトを追加する際に問題が発生するため、呼び出し元のユーザーコントロールへの参照が必要です。

于 2012-01-24T01:42:03.153 に答える