1

タグの外側でコンテンツ (子コントロール) をレンダリングするカスタム コントロールに問題があり、実行時エラーや問題が発生します。できる限り単純化するために、以下のコントロールを作成しましたが、まったく同じ問題があります。Control、WebControl、および CompositeControl から継承しようとしましたが、すべて同じ問題が発生しました。私が間違っていることは明らかだと思います...助けてくれてありがとう。

using System;
using System.Web.UI.WebControls;

namespace MyControls
{
    public class TestControl : CompositeControl
    {
        protected override void CreateChildControls()
        {
            Controls.Clear();
            Controls.Add(new Button() { Text = "TestControl!" });
            ClearChildViewState();
        }
    }
}

コントロールをプログラムで追加すると、forms タグの外側にマークアップが作成されます。マークアップによるコントロールの追加は正しく機能します。

protected void Page_Load(object sender, EventArgs e)
{
    Controls.Add(new TestControl());
}



...
<body>
    <form name="PageForm" method="post" action="default.aspx" id="PageForm">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTE5MDEwMTE5MWRkg0FopdvLhTPGxHkGm1xCCOVQz6A=" />
</div>

    <div>

    </div>
    </form>
</body>
</html>
<span><input type="submit" name="ctl04$ctl00" value="TestControl!" /></span>
4

3 に答える 3

2

これは、カスタム コントロールとは関係ありません。問題は、コントロールをページに追加する方法が原因です。

Controls.Addページのメソッドを呼び出すときPage_Load、これは基本的に次の省略形です。

Page.Controls.Add(new TestControl());

つまり、ページ全体のコントロール階層の最後にコントロールを追加しています。ページがレンダリングされると、コントロールは他のすべての後 (終了</html>タグの後であっても) にレンダリングされます。

コントロールをフォーム内にレンダリングする場合は、代わりにフォームのコントロール階層に追加する必要があります。

Form.Controls.Add(new TestControl());

さらに細かい配置が必要な場合は、ScarletGarden の回答のように、placeholder(またはdivまたはspanなど) をページの必要な位置に配置し、それにコントロールを追加する必要があります。

于 2009-02-16T00:00:36.903 に答える
2

Page.Form プロパティを介してコントロールを追加すると、フォーム内にボタンがレンダリングされます。

Page.Form.Controls.Add(new Button() { Text = "TestControl!" });

ただし、ボタンは <div> などのブロック内に含まれていないため、このボタンにはレイアウトの問題が発生する可能性があります。ScarletGarden のアプローチを使用します。

于 2009-02-15T23:34:05.393 に答える
1

コントロールは問題ないようです。ページにコントロールを追加する際に問題が発生したと思います。

placeHolderをページに追加します。

<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder>
    </div>
    </form>
</body>

次に、複合コントロールをこのプレースホルダーのコントロールコレクションに次のように追加します。

TestControl testCtrl = new TestControl();
placeHolder.Controls.Add(testCtrl);
于 2009-02-15T22:17:33.453 に答える