3

さまざまなページにさまざまなコントロールを動的にロードするサイトウォークスルーモジュールを作成しています。何らかの理由で、サブコントロールのイベントが発生しません。

メインビュー

<%@ Control language="C#" Inherits="DotNetNuke.Modules.SiteWalkthrough.View" AutoEventWireup="false"  Codebehind="View.ascx.cs" %>
<%@ Register Src="/DesktopModules/SiteWalkthrough/Controls/Start.ascx" TagPrefix="sw" TagName="start" %>

<asp:MultiView ID="MultiView" runat="server">
    <asp:View ID="mvStart" runat="server">
        <sw:start ID="ucStart" runat="server"></sw:start>
    </asp:View>
</asp:MultiView>

メイン ビューのコード ビハインド

namespace DotNetNuke.Modules.SiteWalkthrough
{
    public partial class View : SiteWalkthroughModuleBase, IActionable
    {
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }

        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void Page_Load(object sender, System.EventArgs e)
        {
            MultiView.SetActiveView(mvStart);
        }
    }
}

ユーザーコントロール

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Start.ascx.cs" Inherits="DotNetNuke.Modules.SiteWalkthrough.Controls.Start" %>

<div>
    <span>Welcome!</span>
    <span><asp:Button ID="btnNext" runat="server" Text="Okay" CssClass="btnNext" OnClick="btnNext_Click" /></span>
</div>

ユーザー コントロールのコード ビハインド

namespace DotNetNuke.Modules.SiteWalkthrough.Controls
{
    public partial class Start : PortalModuleBase
    {
        protected void Page_Load(object sender, EventArgs e) {}

        protected void btnNext_Click(object sender, EventArgs e) 
        {
            // this event never fires
        }
    }
}

このコードは、標準の ASP.NET プロジェクトでは正常に機能しますが、DotNetNuke では機能しません。メイン ビューの OnInit に手動でイベントを登録する必要がありますか?

4

1 に答える 1

1

私はここで突き刺していますが、コントロールの _load ではなく _init でコントロールとイベントをバインドする必要があると思います。これは、ページのライフサイクルに関係しています。

コントロールの「AutoEventWireup」をオフにして、すべてのイベント バインディングを手動で明示的にコーディングします。

于 2012-04-16T03:44:14.983 に答える