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

C# 如何为用户控件内的控件生成唯一ID,c#,asp.net,c#-4.0,user-controls,C#,Asp.net,C# 4.0,User Controls,我有一个用户控件,其中有一个标签 <asp:Label ID="lblProductionName" runat="server" Text="Production Name will come here"> </asp:Label> 渲染后,我将其作为输出字符串: <span id="lblProductionName">Production Name will come here</span>

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

<asp:Label ID="lblProductionName" 
           runat="server" 
           Text="Production Name will come here">
</asp:Label>
渲染后,我将其作为输出字符串:

<span id="lblProductionName">Production Name will come here</span>
产品名称将显示在此处
现在,当我放置同一用户控件的两个实例时,我在输出字符串中得到了相同的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]++;
}
private Dictionary controlInstances=new Dictionary();
专用字符串渲染控件(控件控件)
{
StringBuilder sb=新的StringBuilder();
StringWriter sw=新的StringWriter(sb);
HtmlTextWriter writer=新的HtmlTextWriter(sw);
int index=getOradControlInstanceCount(控制);
control.clientMode=clientMode.Static;
control.ID=control.GetType().Name+索引;
控件。渲染控件(编写器);
使某人返回字符串();
}
私有int GetOradControlInstanceCount(控制)
{
string key=control.GetType().Name;
如果(!controlInstances.ContainsKey(键))
{
添加(键,0);
}
返回controlInstances[键]+;
}

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

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

为什么要手动呈现html,而不是以编程方式加载
UserControl
并将其添加到页面中(甚至只是在aspx上声明性地添加它们)?我必须在这里使用@TimSchmelter。如果您只是通过
controls.add
方法向其添加控件,并摆脱
RenderControl
方法,只需设置适当的属性或利用
属性。如果需要,添加
-您将摆脱
id
的问题,因为它将利用命名容器。@TimSchmelter:我正在开发一个web表单生成器应用程序,用户可以在其中设计自己的web表单表单中,在这个应用程序中,用户正在动态地将组件(一个组件可能有多个引用)添加到编辑器中,从该编辑器中我得到一个HTML。现在,我阅读了所有HTML,并根据HTML中的组件呈现相应的用户控件,呈现后,我最终得到一个HTML(字符串格式),我最终从代码隐藏中提供给一个div。答案与问题无关。@SidM怎么不?如何为用户控件内的控件生成唯一ID。。。Guid.NewGuid将生成唯一的value@alex:一行回答根本没有帮助,一个工作代码可能会有所帮助。
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]++;
}