如何为用户控件内的控件生成唯一标识符

7

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

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

我使用以下函数从代码后台呈现给定的UC:
``` 我使用以下函数从代码后台呈现给定的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>

现在,当我放置两个相同的用户控件时,输出字符串中会得到相同的span ID。

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


5
为什么你要手动渲染HTML,而不是以编程方式加载UserControl并将其添加到页面上(或者甚至可以在aspx文件中声明式地添加它们)? - Tim Schmelter
我得跟 @TimSchmelter 一起走。如果你只是通过 Controls.Add 方法向其添加控件,并且摆脱 RenderControl 方法,只需设置适当的属性或利用 Attributes.Add(如果必要)- 您将摆脱 id 的问题,因为它将利用命名容器。 - Mike Perrenoud
@TimSchmelter:我正在开发一个Web表单生成器应用程序,用户可以设计自己的Web表单,在该应用程序中,用户动态添加组件(一个组件可能有多个实例)到编辑器中,从编辑器中获取HTML。现在,我读取所有的HTML,并根据HTML中的组件渲染相应的用户控件,渲染完成后,最终将HTML(以字符串格式)提供给后端代码的div。 - Sid M
2个回答

3
始终可行的选项是: Guid.NewGuid :)

答案与问题无关。 - Sid M
1
@SidM 怎么不可以呢?如何在用户控件内为控件生成唯一ID... 使用Guid.NewGuid会生成独特的值。 - alex
2
@alex:那个一行代码的回答完全没有帮助,一个可用的代码可能会更有帮助。 - Sid M

1
你可以尝试这样做:
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]++;
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接