我有一个带有一个标签的用户控件。

<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。我如何生成它?

最佳答案

您可以尝试如下操作:

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]++;
}

更高级的解决方案可能是使用NamingContainer

10-02 01:28
查看更多