2

マイ ページにはユーザー コントロールが含まれており、マスター ページを継承しています。どちらもボタン付きです。フォームタグに入れました。マスターページとユーザーコントロールからイベントバブリングを実行しようとしています。複数のフォームタグエラーのため、ロードされません。どうやってするの?

マスターページ:

<%@ Master Language="C#" AutoEventWireup="True" CodeBehind="SampleSite.master.cs" Inherits="EventBubbling.SampleSite" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            <asp:Button ID="Button1" runat="server" Text="MasterPageButton" />
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

ユーザーコントロール:

<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="SampleUserControl.ascx.cs"
    Inherits="EventBubbling.Controls.SampleUserControl" EnableViewState="false" %>

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="btnUC" runat="server" OnClick="btnUC_Click" Text="UserControlButton" />
    </div>
    </form>
</body>
</html>

ユーザー control.cs ページ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace EventBubbling.Controls
{
    public partial class SampleUserControl : System.Web.UI.UserControl
    {
        public event EventHandler buttonClick;
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnUC_Click(object sender, EventArgs e)
        {
            buttonClick(sender, e);
        }
    }
}

メインページ :

<%@ Page Language="C#" AutoEventWireup="True" MasterPageFile="~/SampleSite.Master"
    CodeBehind="Default.aspx.cs" Inherits="EventBubbling._Default" %>

<%@ Register Src="~/Controls/SampleUserControl.ascx" TagPrefix="uc" TagName="SampleUserControl" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <div>
        <uc:SampleUserControl ID="UC1" runat="server" />
    </div>
</asp:Content>

.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace EventBubbling
{
    public partial class _Default : System.Web.UI.Page
    {
        Button btn = new Button();

        protected void Page_Load(object sender, EventArgs e)
        {
            UC1.buttonClick += new EventHandler(UC1_buttonClick);
            btn = this.Master.FindControl("Button1") as Button;
            btn.Click += new EventHandler(btn_Click);

        }

        void btn_Click(object sender, EventArgs e)
        {
            Response.Write("EventBubbling from MasterPage");
        }

        void UC1_buttonClick(object sender, EventArgs e)
        {
            Response.Write("EventBubbling from User control");
        }

    }
}

私の目標は、イベント バブリングを学習することですが、投稿したこのコードでいくつかの基本的なエラーが発生します。

4

3 に答える 3

3

ユーザー コントロールに < form> タグを含めないでください。これは MasterPage によって処理され、すべてのページ/コントロールがこのマスター コントロールの < form> タグ内にレンダリングされます。

独自のフォームでユーザー コントロールを使用したい場合は、別の MasterPage に変更する必要があります。正直なところ、それがどのように機能するかはわかりません。

于 2013-08-14T12:11:25.190 に答える
1

マスター ページにコントロールを配置したので、<form>その上にタグを保持する必要があります。

エラー メッセージ:A page can have only one server-side Form tag.は、実際には次のように解釈する必要があります。A page can have only one visible server-side Form tag.

必要に応じて、複数のフォーム タグを使用できます。ここで、Asp.net の優れたトリックの 1 つをお読みください: http://blogs.msdn.com/b/kaevans/archive/2005/10/19/482778.aspx。確かにあまり実用的ではありません。

それ以外の場合は、userControl のマークアップを修正する必要があります。head、html、form などのタグを削除します。UserControl の最終的なマークアップは次のようになります。

<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="SampleUserControl.ascx.cs"
    Inherits="EventBubbling.Controls.SampleUserControl" EnableViewState="false" %>
<div>
<asp:Button ID="btnUC" runat="server" OnClick="btnUC_Click" Text="UserControlButton" />
</div>

すべてを削除する必要があるものを理解していただければ幸いです。

このマスター ページの一部になるすべてのページまたはユーザー コントロールには、タグを含めることはできません<form>

于 2013-08-14T12:19:43.680 に答える