首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

.NET 動態載入使用者控制項並傳遞參數

     編輯:ASP.NET 基礎

情境

根據條件動態決定載入哪個 `.ascx`,並需在載入時傳遞參數 (如 `cid`、`aid`)。

後端動態載入與屬性注入

// 取得控制項虛擬路徑
string ascxPath = actionOne[1].ToString(); // 例如 "~/Controls/MyControl.ascx"

// 1. 載入控制項實例
UserControl uc = (UserControl)LoadControl(ascxPath);

// 2. 使用反射設定公開屬性
uc.GetType().GetProperty("cid")?.SetValue(uc, cid.ToString(), null);
uc.GetType().GetProperty("aid")?.SetValue(uc, id.ToString(), null);

// 3. 加入頁面容器
pageAscx.Controls.Add(uc);

使用者控制項 定義屬性

public partial class MyControl : UserControl
{
    private string _cid = "0";
    private string _aid = "0";

    public string cid
    {
        get => _cid;
        set => _cid = value;
    }
    public string aid
    {
        get => _aid;
        set => _aid = value;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // 此時 cid、aid 已有值,可直接使用
        LoadData(cid, aid);
    }
}

進階:強型別介面替代反射

public interface IParameterizedControl
{
    void InitializeParameters(IDictionary parameters);
}

// 控制項實作介面
public partial class MyControl : UserControl, IParameterizedControl
{
    public void InitializeParameters(IDictionary parameters)
    {
        if (parameters.TryGetValue("cid", out var v)) cid = v;
        if (parameters.TryGetValue("aid", out var v)) aid = v;
    }
}

// 載入端
if (uc is IParameterizedControl typed)
    typed.InitializeParameters(new Dictionary { {"cid", cid}, {"aid", id} });

注意事項

  • `LoadControl` 必須在 `Page_Init` 或 `Page_Load` 早期呼叫,否則 ViewState、事件綁定可能失效。
  • 動態載入的控制項 ID 應固定 (`uc.ID = "MyControl"`),否則 PostBack 時無法對應 ViewState。
  • 反射效能較低,高頻呼叫建議改用介面或 `dynamic` 關鍵字 (C# 4.0+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved