2

ScriptControl に基づいてコントロールを作成し、次のRenderようにメソッドをオーバーライドしています。

protected override void Render(HtmlTextWriter writer)
{
    RenderBeginTag(writer);

    writer.RenderBeginTag(HtmlTextWriterTag.Div);
    writer.Write("This is a test.");
    writer.RenderEndTag();

    RenderEndTag(writer);
}

私の質問は、コントロールのインスタンスが複数ある場合でも、div に ID 属性を割り当ててページ上で一意にしたい場合はどうすればよいですか?

これを行う他の人のコードを見てきました:

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest");

これにより、コントロールのインスタンス間の名前の競合を防ぐことができますが、偶然にも同じ ID を持つ div をページの別の場所に作成してしまった場合はどうなるでしょうか?

INamingContainer の実装についても聞いたことがあります。それはここに当てはまりますか?どのように使用できますか?

更新

CreateChildControlsHTML を直接レンダリングするのではなく、実際のコントロールをオーバーライドして追加することで、この問題を回避しました。その場合、INamingContainer がその役割を果たします。ただし、元の問題 (直接レンダリングされた要素の一意の ID) を解決する方法があるかどうかはまだ興味があります。

4

3 に答える 3

0

INamingControllerはマーカーインターフェイスです。これを実装すると、コントロールのインスタンスごとに一意のIDが保証されます。

http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

  public class MyScriptControl: ScriptControl, INamingContainer {

  }
于 2010-04-27T19:53:42.833 に答える
0

私はあなたの問題を理解しようとしています:

public class SC : ScriptControl
{
    protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        return null;
    }
        protected override IEnumerable<ScriptReference> GetScriptReferences()
        {
            return null;
        }
    }
    //... Page code
        protected void Page_PreRender(object sender, EventArgs e)
        {
            var sc = new SC();
            var sc1 = new SC();
            Page.Form.Controls.Add(sc);
            Page.Form.Controls.Add(sc1);
        }

ただし、sc と sc1 の ClientID は異なります。したがって、ASP.NET の問題ではありません。あなたの実現を見てください。ScriptControls を Page に追加する前に div の ID を生成するか、1 つの ScriptControl のスコープで 2 つの div を作成しようとするか、async-posback で動的に ScriptConrol2 を作成し、ScriptControl1 と同じ ID を持っている可能性があります。ポストバック時に動的に追加されません。

于 2010-05-12T22:19:18.743 に答える
0

一意のIDを取得するためだけにコントロールのインスタンスを作成したくないでしょう。そのアプローチには無駄なオーバーヘッド/複雑さがあります。Control.ID プロパティは一意ではない場合がありますが、Control.ClientID プロパティは一意になります。したがって

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest"); 

カスタム コントロールでサフィックス「_divTest」を 2 回使用しない限り、その属性は一意である必要があります。

于 2010-05-12T20:01:08.920 に答える