ASP.NET: генерировать значение свойства при добавлении элемента управления на страницу - PullRequest
1 голос
/ 12 февраля 2009

Контекст: ASP.NET 3.5 / C #

Привет

Я создал пользовательский элемент управления

public partial class MyControl : UserControl
{
    // EDIT: example first used "UniqueId" as property name, which was wrong.
    public Guid MyId { get; set; }
    // ...
}

и использование этого примера

<uc1:MyControl 
    ID="myControl" 
    MyId="443CBF34-F75F-11DD-BE2F-68C555D89123"
    runat="server" />

Шаги:

  • Добавить этот элемент управления в веб-форму (aspx)

Ожидаемый результат:

  • HTML-код для пользовательского элемента управления добавлен, уникальное значение (соответствующее Guid.NewGuid ()) для MyId устанавливается в ASPX HTML во время разработки как значение атрибута MyId.

Фактический результат:

  • HTML для пользовательского элемента управления добавлен, уникальное значение для MyId не задано в HTML во время разработки для значения атрибута MyId.

Если это невозможно:

  • Обходной путь 1: Можно ли добиться этого с помощью серверного элемента управления? Как?
  • Обходной путь 2: возможно ли добиться этого с помощью задачи в режиме разработки UserControl?

Уточнение:

  • сохранение значения свойства не проблема, так как оно никогда не изменяется для экземпляра элемента управления и автоматически устанавливается ASP.NET через объявление элемента управления на странице aspx.
  • Атрибут MyId не требуется отображать во время выполнения.

Gr B!

Ответы [ 4 ]

0 голосов
/ 16 февраля 2009

Если я правильно понимаю ваш вопрос, вы выставляете свойство в своем пользовательском элементе управления под названием MyId. Это позволяет вам устанавливать свойство везде, где вы помещаете этот элемент управления.

Вы также хотите, чтобы отображаемый HTML-код также содержал этот атрибут и значение.

Если это так, свойство MyId не передается в HTML, это только потому, что пользовательский элемент управления имеет MyId в качестве свойства, которое видно в конструкторе.

В вашем пользовательском контроле вы определили разметку, которая будет отображаться. Так, например, если у вас есть:

<asp:Panel runat="Server" Id="myControlDiv">Some other content</asp:Panel>

Затем вы можете в событии prerender вашего управления (или где бы вы ни выбрали) поставить

myControlDiv.Attributes.Add("MyId", SomeGuid.ToString())

Который затем получит вывод в HTML как

<div id="generatedID" MyID="443CBF34-F75F-11DD-BE2F-68C555D89123">Some other content</div>
0 голосов
/ 03 марта 2009

То есть вы просто хотите, чтобы сгенерированный уникальный идентификатор использовался только во время разработки?

Почему бы не переопределить Object.GetHasCode ();

А потом разоблачить это как собственность?

0 голосов
/ 12 февраля 2009

У вас здесь пара проблем, но сначала я отвечу на ваши вопросы об обходных путях.

  1. Нет, вы уже используете серверный элемент управления.
  2. Никакой дизайн-режим не должен просто облегчать жизнь разработчику, он не влияет ни на что другое

У вас здесь две проблемы. Уже есть свойство под названием UniqueID Я не знаю, пытались ли вы его перегрузить, но вопрос не был ясен. Вторая проблема заключается в том, что ваш UniqueID практически нигде не сохраняется. Попробуйте следующий код:

public Guid UniqueId {
    get { return (Guid)ViewState["MyUserControlUniqueId"]; }
    set { ViewState["MyUserControlUniqueId"] = value; }
}

Это сохранит GUID в ViewState, чтобы вы могли получить его на задних почтовых отправлениях.

Обновление: Учитывая ваш комментарий, вам нужно переопределить / использовать этот метод для добавления атрибутов к отображаемому контенту.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.addattributestorender.aspx

...