Обеспечение уникального атрибута ID для элементов в ScriptControl

Я создаю элемент управления на основе ScriptControl и переопределяю Render метод как это:

protected override void Render(HtmlTextWriter writer)
{
    RenderBeginTag(writer);

    writer.RenderBeginTag(HtmlTextWriterTag.Div);
    writer.Write("This is a test.");
    writer.RenderEndTag();

    RenderEndTag(writer);
}

У меня вопрос: что если я захочу присвоить атрибуту div идентификатор ID и сделать его уникальным на странице, даже если есть несколько экземпляров моего элемента управления?

Я видел код других людей, который делает это:

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest");

Это предотвратит конфликты имен между экземплярами моего элемента управления, но что если я уже создал div в другом месте на странице, который по совпадению имеет такой же идентификатор?

Я также слышал о реализации INamingContainer. Будет ли это применяться здесь? Как я мог использовать это?

ОБНОВЛЕНИЕ:

Я работал над этим путем переопределения CreateChildControls и добавление фактических элементов управления, в отличие от визуализации HTML напрямую. В этом случае INamingContainer делает свою работу. Тем не менее, мне все еще любопытно, есть ли способ решить мою первоначальную проблему (уникальные идентификаторы для непосредственно отображаемых элементов).

3 ответа

Я пытался понять вашу проблему:

public class SC : ScriptControl
{
    protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        return null;
    }
        protected override IEnumerable<ScriptReference> GetScriptReferences()
        {
            return null;
        }
    }
    //... Page code
        protected void Page_PreRender(object sender, EventArgs e)
        {
            var sc = new SC();
            var sc1 = new SC();
            Page.Form.Controls.Add(sc);
            Page.Form.Controls.Add(sc1);
        }

Но sc и sc1 имеют разные ClientID. Так что это не проблема ASP.NET. Посмотри на свою реализацию. Может быть, вы генерируете идентификаторы для div перед добавлением ScriptControls на Page, или вы можете попытаться создать 2 div в области действия одного ScriptControl, или вы можете динамически создавать ScriptConrol2 в async-posback, и у него такой же идентификатор, что и у ScriptControl1, что динамически не добавляется при обратной передаче.

INamingController - это маркерный интерфейс. Реализация этого гарантирует вам уникальные идентификаторы для каждого экземпляра вашего контроля.

http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

  public class MyScriptControl: ScriptControl, INamingContainer {

  }

Вы не захотите создавать экземпляры элементов управления только для того, чтобы получать уникальные идентификаторы, в этом подходе бесполезные издержки / сложность. Свойство Control.ID может быть не уникальным, но свойство Control.ClientID будет уникальным. Следовательно

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest"); 

этот атрибут должен быть уникальным, если вы не используете суффикс "_divTest" дважды в своем пользовательском элементе управления.

Другие вопросы по тегам