Как вы можете перемещать элементы управления ASP.Net в разные места веб-формы во время выполнения? - PullRequest
5 голосов
/ 03 апреля 2009

Есть ли принятый способ "переместить" элемент управления.

Мой клиент хочет разместить определенный фрагмент разметки (представляющий некоторый визуальный элемент) в одном из нескольких разных мест на странице. Местоположения отличаются тем, что я не могу повлиять на изменение CSS (запустив его или что-то в этом роде).

Я подумал о том, чтобы просто поставить элемент управления в нескольких местах с Visible, установленным в значение «false», а затем отобразить тот элемент, который им нужен для этой конкретной страницы.

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

Итак, я хотел бы поместить это в одно место в веб-форме, перемещая его в зависимости от того, где я хочу. Могу ли я разместить метки-заполнители в разных местах, разместить элемент управления в одном месте, затем удалить и добавить его в нужное место? Я подозреваю, что это сработает.

У кого-нибудь есть идея получше? Есть ли лучшая практика для этого?

Ответы [ 5 ]

5 голосов
/ 03 апреля 2009

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

Например.

// Load a user control
MyControl userCtrl = (MyControl) LoadControl("~/Controls/MyControl.ascx");

// Or create an instance of your control
SubclassedControl subclassedCtrl = new SubclassedControl();

// Do stuff with controls here
userCtrl.LoadData();
subclassedCtrl.Text = "Hello World";

// Check which placeholder to add controls to
PlaceHolder placeHolder = (foo=="bar") ? placeHolder1 : placeHolder2;

// Add the controls
placeHolder.Controls.Add(userCtrl);
placeHolder.Controls.Add(subclassedCtrl);

Это позволит избежать загромождения вашей страницы ненужной разметкой, а загрузка ее во время выполнения также позволит избежать ненужной путаницы позже, когда другой разработчик смотрит на код и не может сразу увидеть, почему элемент управления находится в одном месте в разметке, но отображается на совершенно другой части страницы.

3 голосов
/ 03 апреля 2009

Альтернатива (которую я видел много раз раньше) - через javascript и DOM. Визуализируйте свой контроль внутри скрытого тега div. Таким образом, вы бы представили свой контент здесь:

<div id='rendercontent' style='display:none'>
  .. control here ..
</div>

Тогда, допустим, вы хотели переместить все это сюда (тег span находится внутри, потому что это то, что мы собираемся заменить):

<div id='newlocation1'><span></span></div>

Вы бы определили следующий javascript:

<script language="JavaScript">
function replaceNode(newElementID, targetElementID)
{
    var targetElement=document.getElementById(targetElementID);
    var newElement=document.getElementById(newElementID);
    targetElement.replaceChild(newElement, targetElement.firstChild);
}
</script>

А когда вы хотите переместить контент в новое место, позвоните по номеру

<script language="JavaScript">
replaceNode('rendercontent','newlocation1');
</script>
2 голосов
/ 03 апреля 2009

Делают ли веб-части то, что вы хотите?

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

1 голос
/ 03 апреля 2009

Вы можете переопределить метод рендеринга и поместить элементы управления в HTML.

Вам нужно только добавить элементы управления в коллекцию элементов управления, которые должны взаимодействовать на сервере. Остальная часть вашего HTML может быть просто записана в поток ответов. Если вы переопределите Render, вы можете создать html в любом случае, разместив элементы управления в любом порядке.

Ниже приведен пример того, как выписать ваш HTML.

protected override void Render(HtmlTextWriter writer)
{
  AddAttributesToRender(writer);
  writer.RenderBeginTag(TagKey);

  writer.RenderBeginTag(HtmlTextWriterTag.Div);
  _control.RenderControl(writer);
  writer.RenderEndTag();

  writer.RenderEndTag();
}
0 голосов
/ 03 апреля 2009

Вы всегда можете поместить панели в предопределенные места и добавить элемент управления к определенной панели во время выполнения. Вот пример добавления метки (метку можно заменить любым элементом управления).

Dim lblDisplay As Label = New Label()
lblDisplay.ID = "myLabel"
lblDisplay.Text = "Some Text"
pnlDisplay.Controls.Add(lblDisplay)

Насколько ...

Кроме того, я не хочу работать с этим контролем строго из код позади по той же причине. "

Я думаю, вам придется выполнять большую часть своей работы в коде.

PS .. хороший пример всей настройки usercontrol можно скачать здесь .. http://www.asp.net/downloads/starter-kits/time-tracker/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...