共用方式為


建立樣板化的使用者控制項

您可以建立實作樣板的使用者控制項 (這是 ASP.NET 的一項功能,可將控制項資料與它的展示分開來)。樣板化的控制項不提供使用者介面 (UI)。控制項的 UI 是由網頁開發人員透過內嵌 (Inline) 樣板來提供,可讓網頁開發人員自訂控制項的 UI。建立樣板化的使用者控制項,可讓您在應用程式中輕鬆地將使用者控制項加入網頁中,而不必將自訂控制項編譯成 .dll 檔案。

如需建立自訂樣板化控制項的詳細資訊,請參閱開發樣板化的控制項

若要建立樣板化的使用者控制項

  1. 在 .ascx 檔案中樣板出現的位置,以宣告方式建立 ASP.NET Placeholder Web 伺服器控制項。

  2. 在使用者控制項的程式碼宣告區塊或程式碼後置類別中,實作 ITemplate 型別的屬性。

  3. 在相同的程式碼區塊中,定義一個伺服器控制項,將 INamingContainer 實作為一容器,而在該容器中可建立樣板的執行個體。這個就稱為樣板的命名容器。

    **注意   **這個控制項最後一定會變成使用者控制項的巢狀類別 (Nested Class),雖然這並不是必要項。

  4. TemplateContainerAttribute 套用至 ITemplate 屬性,並將樣板的命名容器型別當作引數,傳遞至建構函式 (Constructor) 或屬性。

  5. Page_Init 方法中,重複下列步驟一次或多次:

    • 建立命名容器類別的執行個體。

    • 在命名容器中建立樣板的執行個體。

    • 將命名容器執行個體加入至 PlaceHolder 伺服器控制項的 Controls 屬性中。

      **注意   **從使用使用者控制項的網頁觀點來看,樣板化使用者控制項的語法與自訂樣板化控制項的語法完全相同。

下列範例示範樣板化的使用者控制項以及包含它的網頁。

**注意   **這個範例只會公開一個樣板屬性,但是您可以依照應用程式正常執行時所需,公開多個樣板屬性。

樣板化使用者控制項:

<%@ Control language="VB" debug="True" %>
<script runat="server" >
Private messageTemplate As ITemplate = Nothing
<TemplateContainer(GetType(MessageContainer))>Public Property MessageTemplate() As ITemplate
    Get
        Return messageTemplate
    End Get
    Set
        messageTemplate = value
    End Set
End Property
    
Sub Page_Init()
    If Not (messageTemplate Is Nothing) Then
        Dim i As Integer
        For i = 0 To 4
            Dim container As New MessageContainer(i)
            messageTemplate.InstantiateIn(container)
            msgholder.Controls.Add(container)
        Next i
    End If
End Sub 'Page_Init


Public Class MessageContainer
    Inherits Control
    Implements INamingContainer 

    Private index As Integer
    
    Friend Sub New(index As Integer)
        Me.index = index
    End Sub 'New
    
    Public ReadOnly Property Index() As Integer
        Get
            Return index
        End Get
    End Property 
End Class 'MessageContainer
</script>

<hr>
<asp:placeholder runat=server id=msgholder/>
<hr>
[C#]
<%@ Control language=c# debug=true %>
<script runat=server>
private ITemplate messageTemplate = null;      

[ TemplateContainer(typeof(MessageContainer)) ]
public ITemplate MessageTemplate {
    get { return messageTemplate; }
    set { messageTemplate = value; }
}

void Page_Init() {
    if (messageTemplate != null) {
        for (int i=0; i<5; i++) {
            MessageContainer container = new MessageContainer(i);
            messageTemplate.InstantiateIn(container);
            msgholder.Controls.Add(container);
        }
    }
}

public class MessageContainer: Control, INamingContainer {
    private int index;
    internal MessageContainer(int index) { this.index = index; }
    public int Index { get { return index; } }
}

</script>

<hr>
<asp:placeholder runat=server id=msgholder/>
<hr>

包含樣板化使用者控制項的 ASP.NET 網頁。

<%@ language=vb debug=true %>
<%@ Register TagPrefix="acme" tagname="test" src=TemplatedUserControl.ascx %>
<html>
<script runat=server>
    Sub Page_Load()
        DataBind()
    End Sub 'Page_Load
</script>
<body>
' The Container in the data-binding syntax will automatically be of type
' MessageContainer, since the TemplateContainer attribute was applied 
' to the ITemplate class in the .ascx file.
<form runat=server>
<acme:test runat=server>
    <MessageTemplate>
        Hello #<%# Container.Index %>.<br>
    </MessageTemplate>
</acme:test>
</form>
</body>
</html>
[C#]
<%@ language=c# debug=true %>
<%@ Register TagPrefix="acme" tagname="test" src=TemplatedUserControl.ascx %>
<html>
<script runat=server>
    void Page_Load() {
        DataBind();
    }
</script>
<body>
// The Container in the data-binding syntax will automatically be of type
// MessageContainer, since the TemplateContainer attribute was applied 
// to the ITemplate class in the .ascx file.
<form runat=server>
<acme:test runat=server>
    <MessageTemplate>
        Hello #<%# Container.Index %>.<br>
    </MessageTemplate>
</acme:test>
</form>
</body>
</html>

請參閱

Web Form 使用者控制項的簡介 | Web Form 程式碼模型 | 在 Web Form 網頁中包含使用者控制項 | @ Control | UserControl