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

Я создаю элемент управления на основе 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 ID и сделать его уникальным на странице, даже если есть несколько экземпляров моего элемента управления?

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

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

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

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

UPDATE

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

Ответы [ 3 ]

0 голосов
/ 13 мая 2010

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

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

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

0 голосов
/ 13 мая 2010

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

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, что динамически не добавляется при обратной передаче.

0 голосов
/ 27 апреля 2010

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

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

  public class MyScriptControl: ScriptControl, INamingContainer {

  }
...