ASP.NET Control дилемма видимости - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть Page, GridView с использованием ObjectDataSource с SelectMethod и DropDownList. SelectMethod, кроме всего прочего, получает строковый массив, содержащий несколько идентификаторов (для фильтрации данных) - но он мне также нужен как DataSource для DropDownList. Увы, я не могу DataBind DropDownList внутри SelectMethod, поскольку он нулевой. Идея заключалась бы в том, чтобы связать этот string[] с Session -вариантом, но тогда мне пришлось бы либо переустанавливать его на каждый Page_Load, либо удалять его из Session на каждой другой странице, если я этого хочу обновить в случае, если что-то в базе данных изменилось.

Я ищу какую-то переменную, которая доступна как в Page_Load, так и в моем ObjectDataSource s SelectMethod, но она удаляется при выходе из страницы (то есть при переходе на любую другую страницу в моей сети). -Применение (желательно без вызова метода на КАЖДОЙ другой странице).

Надеюсь, вы поняли мою проблему.

Спасибо

Dennis

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Мне нужна переменная, которая доступна как в Page_ Load, так и в моих ObjectDataSource SelectMethod, но удаляется при выходе из страницы (т. Е. Переход к любойдругая страница в моем веб-приложении (желательно без вызова метода на КАЖДОЙ другой странице).

В аналогичной ситуации я использовал свойство Items текущего HttpContextЭто IDictionary (неуниверсальный), поэтому он может содержать произвольные object s с произвольными object s, а его время жизни точно соответствует продолжительности текущего запроса, поэтому исчезнет, ​​как только запрос будетзакончено. Для использования:

// Where you first get the data
HttpContext.Current.Items["SomeKey"] = new [] { "string1", "string2" };

// Where you want to to use the data
var strings = (string[])HttpContext.Current.Items["SomeKey"];
1 голос
/ 28 февраля 2012

Как я понимаю, необходимость извлечения строкового массива возникает из-за падения производительности, которое вызовет отдельная передача туда и обратно. Чтобы обойти это, вы можете создать отдельный объект для подачи источника данных вашего объекта. Этот объект будет иметь два метода: один для получения массива строк, а другой - для получения данных для сетки (т. Е. Метод выбора)

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

protected void odsSomething_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
    e.ObjectInstance = YourInsntanceAlreadyInThePage;
}

Таким образом, вы избежите поездки туда и обратно.

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

...