簡體   English   中英

通過在運行時添加 ASP.NET 用戶控件<script runat=“server”>

[英]Adding ASP.NET User Controls at runtime via <script runat=“server”>

我在*.aspx頁面中的<script runat="server">標記內執行控件時遇到問題。

該控件在頁面的 HTML 部分中以聲明方式定義時工作,但當放置在腳本標記本身中時,我無法使其工作。

在頁面的開頭,我注冊了我的控件:

<%@ Register assembly="App_Web_exemple.ascx.cc671b29" namespace="Moncontrol" tagprefix="moncontrol" %>

然后,在 HTML 中,我使用以下聲明(成功地)調用它:

<moncontrol:exemple ISBN="9782894646151" runat="server" />

但是,當我嘗試在<script runat="server">以編程方式添加它時,我無法執行它。 我嘗試使用標簽<asp:Text /><asp:Literal /> ,如下所示,但這也不起作用。

在 HTML 部分:

<asp:Text id="TestControl" runat="server" />

在腳本部分

TestControl.Text = "<moncontrol:exemple ISBN=\"9782894646151\" runat=\"server\" />";

澄清一下,您要做的是在運行時以編程方式將用戶控件添加到 Web 窗體頁面。 有幾種方法可以實現這一點。

在我們開始之前,值得注意的是,您編寫的代碼可能“有效”,因為它可以編譯並且不會拋出運行時錯誤。 但它也沒有執行控制。 我懷疑如果您查看您的 HTML,您會發現控件聲明是作為字符串文字輸出的(即,未由服務器處理)。 然后它會被瀏覽器忽略,因為它不知道<moncontrol:exemple />標簽代表什么。 這顯然不是你想要的。

建立控制容器

無論您采用哪種方法,您都希望從頁面上的某種類型的容器開始,您可以將控件添加到其中,例如Panel 如果您不希望容器輸出任何包裝標記,您可以使用Placeholder

<asp:Placeholder id="ControlContainer" runat="server" />

這與您當前的Text控件的用途相似,但其唯一目的是提供一個容器,您將向其中添加用戶控件。 但是,從 ASP.NET 的角度來看,根據您的請求,這可以是任何類型的服務器控件,包括<script runat="server"> 稍后再談。

以編程方式創建控件

接下來,您將以編程方式創建控件。 這是我們遇到各種選擇的地方。 最通用的方法是使用ParseControl()方法( 參考)。 這看起來像這樣:

Control control = Page.ParseControl("<%@ Register assembly=\"App_Web_exemple.ascx.cc671b29\" namespace=\"Moncontrol\" tagprefix=\"moncontrol\" %><moncontrol:exemple ISBN=\"9782894646151\" runat=\"server\" />");

這將使用處理頁面上的聲明性語法的相同方法解析控件,並返回一個Control對象,其中您的Exemple控件作為其Controls集合中的第一個Controls

但是,我發現該語法有點草率,因為它將 .NET 對象及其屬性表示為字符串文字。 鑒於此,有一些更清潔的方法。 在這種情況下,您的控件似乎正在被編譯為程序集,因此可能定義了一個繼承自UserControl的代碼UserControl 如果是這樣,您應該能夠簡單地執行以下操作:

Exemple control = new Exemple();

然后以編程方式設置它的屬性,就像在任何其他 C# 對象中一樣。 干凈多了!

如果您的控件不是由服務器動態編譯,那么您應該使用帶有LoadControl()方法的Reference指令,如 MSDN 文章如何:以編程方式創建 ASP.NET 用戶控件的實例中所述 然而,我不相信這種方法對你有用。

將控件實例添加到頁面

無論您采用哪種方法,下一步都是相同的:然后將您以編程方式添加到頁面的Controls添加到目標容器的Controls集合中。 例如,:

ControlContainer.Controls.Add(control);

注意:您可以在技術上只添加這在Page類的Control集合,太多,但不給你過網頁上它被放置任何控制; 擁有PlaceHolder控件(或等效控件)可讓您准確指定希望控件出現的位置。

我希望這有幫助。 根據您編寫和編譯控件的方式,有幾個注意事項,但這應該為您提供解決問題所需的基本結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM