0

Ektron pagebuilder ウィジェットで奇妙な問題が発生しています。

何らかの理由で、ウィジェットのビューを切り替えるウィジェット内の任意のボタンからサーバーにポストバックすると、これらのビュー内のスクリプトが実行されません。

ウィジェットの「モード」を制御するマルチビューは、額面通りの通常のマルチビューのように見えるので、なぜこのように動作するのかわかりません。ビューとアラートを交換するだけの 2 つ目のマルチビューをページに追加して、これをテストしました。これは、ウィジェットの外側のテンプレートに配置すると期待どおりに機能しますが、ウィジェットの内側ではスクリプトを実行できません。さらに、ウィジェット内のいずれかのボタンがクリックされると、クリックされたマルチビューに関係なく、サーバーがポストバックすると消えるローディング画像が ektron によって開かれます。これは、Ektron がこれらのウィジェット スクリプトの実行を抑制するために積極的に何かを行っていると私に思わせます。

ウィジェットコード:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestWidget.ascx.cs" Inherits="widgets_TestWidget" %>

<asp:MultiView ID="ViewSet" runat="server" ActiveViewIndex="0">
    <asp:View ID="View" runat="server">
        <script>alert('this runs');</script>
        <asp:Label ID="OutputLabel" runat="server"></asp:Label>
    </asp:View>
    <asp:View ID="Edit" runat="server">
        <div id="<%=ClientID%>_edit">
            <script>alert('but for some reason, this does not run');</script>
            <asp:TextBox ID="HelloTextBox" runat="server" Style="width: 95%"> </asp:TextBox>
            <asp:Button ID="CancelButton" runat="server" Text="Cancel" OnClick="CancelButton_Click" />
            &nbsp;&nbsp;
                <asp:Button ID="SaveButton" runat="server" Text="Save" OnClick="SaveButton_Click" />
        </div>
    </asp:View>

</asp:MultiView>

<!--code below works properly outside of the widget and fails inside of it -->

<asp:MultiView ID="uxmulti" runat="server" ActiveViewIndex="0">
    <asp:View ID="view1" runat="server">
        <script>alert('this runs');</script>
        <asp:Button ID="ux_b1" runat="server" OnClick="ux_b1_Click" Text="to edit" />
    </asp:View>
    <asp:View ID="edit1" runat="server">
        <script>alert('as does this, but not inside the widget');</script>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="to view" />
    </asp:View>
</asp:MultiView>

ウィジェットの分離コード:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Ektron.Cms.Widget;
using Ektron.Cms;
using Ektron.Cms.API;
using Ektron.Cms.Common;
using Ektron.Cms.PageBuilder;
using System.Configuration;

public partial class widgets_TestWidget : System.Web.UI.UserControl, IWidget
{
    #region properties
    private string _HelloString;
    [WidgetDataMember("Hello World")]
    public string HelloString { get { return _HelloString; } set { _HelloString = value; } }
    #endregion

    IWidgetHost _host;
    protected ContentAPI m_refContentApi = new ContentAPI();
    protected EkMessageHelper m_refMsg;

    protected void Page_Init(object sender, EventArgs e)
    {
        string sitepath = new CommonApi().SitePath;
        JS.RegisterJSInclude(this, JS.ManagedScript.EktronJS);
        JS.RegisterJSInclude(this, JS.ManagedScript.EktronModalJS);
        Css.RegisterCss(this, Css.ManagedStyleSheet.EktronModalCss);
        _host = Ektron.Cms.Widget.WidgetHost.GetHost(this);
        m_refMsg = m_refContentApi.EkMsgRef;
        _host.Title = m_refMsg.GetMessage("lbl hello world widget");
        _host.Edit += new EditDelegate(EditEvent);
        _host.Maximize += new MaximizeDelegate(delegate() { Visible = true; });
        _host.Minimize += new MinimizeDelegate(delegate() { Visible = false; });
        _host.Create += new CreateDelegate(delegate() { EditEvent(""); });
        CancelButton.Text = m_refMsg.GetMessage("btn cancel");
        SaveButton.Text = m_refMsg.GetMessage("btn save");
        PreRender += new EventHandler(delegate(object PreRenderSender, EventArgs Evt) { SetOutput(); });
        string myPath = string.Empty;
        if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["ek_helpDomainPrefix"]))
        {
            string helpDomain = ConfigurationManager.AppSettings["ek_helpDomainPrefix"];
            if ((helpDomain.IndexOf("[ek_cmsversion]") > 1))
            {
                myPath = helpDomain.Replace("[ek_cmsversion]", new CommonApi().RequestInformationRef.Version);
            }
            else
            {
                myPath = ConfigurationManager.AppSettings["ek_helpDomainPrefix"];
            }
        }
        else
        {
            myPath = sitepath + "Workarea/help";
        }
        _host.HelpFile = myPath + "EktronReferenceWeb.html#Widgets/Creating_the_Hello_World_Widget.htm";
        ViewSet.SetActiveView(View);
    }

    protected void SetOutput()
    {
        OutputLabel.Text = HelloString;
    }

    void EditEvent(string settings)
    {
        HelloTextBox.Text = HelloString;
        ViewSet.SetActiveView(Edit);
    }
    protected void SaveButton_Click(object sender, EventArgs e)
    {
        HelloString = HelloTextBox.Text;
        _host.SaveWidgetDataMembers();
        ViewSet.SetActiveView(View);
    }
    protected void CancelButton_Click(object sender, EventArgs e)
    {
        ViewSet.SetActiveView(View);
    }
    protected void ux_b1_Click(object sender, EventArgs e)
    {
        uxmulti.SetActiveView(edit1);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        uxmulti.SetActiveView(view1);
    }

}

これはダーティーな eval ステートメントを使用して回避できますが、それは理想とはほど遠いものです。なぜこれがこのように動作するのか、またはそれを解決する方法についてのアイデアはありますか?

エクトロン 8.6.1、サーバー 2008 R2、SQL サーバー 2008。

4

1 に答える 1

1

ウィジェットがビューを切り替えるとき (つまり、View から Edit に)、Ajax ポストバックを使用してこれを行います (UpdatePanel 内にあると思います)。これは、部分的なポストバックが原因で、インライン スクリプトまたは「onload」を実行するように設定されたスクリプトが実行されないことを意味します。

そのため、UpdatePanel の更新後に JavaScript コードを実行する方法に注目する必要があります。次のようなことを試すことができます:

function foo()
{
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}
function endRequestHandler(sender, args)
{
    // Do your stuff
    alert('Update Panel routine is now complete');
}
于 2013-11-07T11:42:15.153 に答える