Передача данных со страницы ASP.NET в пользовательские элементы управления ASCX, загружаемые динамически - PullRequest
24 голосов
/ 04 февраля 2010

Я разрабатываю приложение ASP.NET с C # и Ajax.

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

Теперь я использую Session для передачи этих значений, но я думаю, что могу использовать другой способ; что-то вроде VIEWSTATE или скрытого ввода.

Что вы мне порекомендуете?

UPDATE:

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

Ответы [ 6 ]

44 голосов
/ 04 февраля 2010

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

public class myControl : Control
{
  ...
  public int myIntValue {get; set;}
  ...
}

В коде позади:

myControl ctrl = new myControl();
ctrl.myIntValue = 5;

Вы также можете сделать это прямо в разметке:

<uc1:myControl ID="uc1" runat="server" myIntValue="5" />
11 голосов
/ 04 февраля 2010

Настройка общедоступных свойств в вашем пользовательском элементе управления.

public string TestValue { get;set;};

А потом, когда вы поместите свой пользовательский элемент управления на страницу aspx:

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" />

Вы также можете изменить значения в вашем коде:

uc1.testValue = "some value";
3 голосов
/ 05 февраля 2010

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

Динамические веб-элементы управления, обратные передачи и состояние просмотра

3 голосов
/ 04 февраля 2010

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

Первое, что я хотел бы сделать, это заставить вашу страницу реализовать интерфейс.

В контроле:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();

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

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

У вас должна быть очень веская причина, чтобы сделать это. Для нас: загрузка общего объекта была очень дорогой, и загрузка / сохранение страницы независимо от того, какой элемент управления работал над этим объектом, была весьма полезной.

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

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

0 голосов
/ 04 февраля 2010

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

http://www.4guysfromrolla.com/articles/060904-1.aspx

ИМХО, это немного лениво, но в некоторых ситуациях это может быть хорошим решением.

0 голосов
/ 04 февраля 2010

Вид поражает цель использования IMO управления ascx, поскольку это нарушает инкапсуляцию управления. Ваша страница должна получать данные от элемента управления через подписку на события, опубликованные элементом управления.

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