如何为用户控件内的控件生成唯一 ID

本文关键字:控件 唯一 ID 用户 | 更新日期: 2023-09-27 18:34:08

我有一个用户控件,其中我有一个标签。

<asp:Label ID="lblProductionName" 
           runat="server" 
           Text="Production Name will come here">
</asp:Label>

我使用此函数从代码隐藏中渲染给定的 UC:

private string RenderControl(Control control)
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter writer = new HtmlTextWriter(sw);
    control.RenderControl(writer);
    return sb.ToString();
}

渲染后,我得到这个作为输出字符串:

<span id="lblProductionName">Production Name will come here</span>

现在,当我放置同一用户控件的两个实例时,我在输出字符串中得到相同的跨度 ID。

我想为用户控件的两个实例生成两个不同的 ID。如何生成它?

如何为用户控件内的控件生成唯一 ID

始终有效的选项是:Guid.NewGuid :)

你可以尝试这样的事情:

private Dictionary<string, int> controlInstances = new Dictionary<string, int>();
private string RenderControl(Control control)
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter writer = new HtmlTextWriter(sw);
    int index = GetOrAddControlInstanceCount(control);
    control.ClientIDMode = ClientIDMode.Static;
    control.ID = control.GetType().Name + index;
    control.RenderControl(writer);
    return sb.ToString();
}
private int GetOrAddControlInstanceCount(Control control)
{
    string key = control.GetType().Name;
    if (!controlInstances.ContainsKey(key))
    {
        controlInstances.Add(key, 0);
    }
    return controlInstances[key]++;
}

更高级的解决方案可能是使用命名容器。