【问题标题】:How To generate unique ID for controls inside a User Control如何为用户控件中的控件生成唯一 ID
【发布时间】:2013-10-07 12:41:34
【问题描述】:

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

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

【问题讨论】:

  • 为什么要手动渲染 html 而不是以编程方式加载 UserControl 并将其添加到页面中(或者甚至简单地在 aspx 上以声明方式添加它们)?
  • 我得和@TimSchmelter 一起去。如果您只是通过Controls.Add 方法向它添加控件,并摆脱RenderControl 方法并设置适当的属性或在必要时利用Attributes.Add - 您将摆脱id 的问题因为它将利用命名容器。
  • @TimSchmelter:我正在开发一个 Web 表单生成器应用程序,用户可以在其中设计自己的 Web 表单,在这个应用程序中,用户正在动态添加组件(一个组件可能不止一次出现)到编辑器,从那个编辑器我得到一个 HTML。现在,我阅读了所有 HTML,并根据该 HTML 中的组件,渲染了相应的用户控件,在渲染之后,我终于得到了一个 HTML(字符串格式),我最终从后面的代码中提供给一个 div。

标签: c# asp.net c#-4.0 user-controls


【解决方案1】:

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

【讨论】:

  • 答案与问题无关。
  • @SidM 怎么样?如何为用户控件中的控件生成唯一 ID...Guid.NewGuid 将生成唯一值
  • @alex :一个班轮的答案根本没有帮助,工作代码可能会有所帮助。
【解决方案2】:

你可以试试这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多