#asp.net
#asp.net
Вопрос:
Я пытаюсь сделать что-то вроде
Server.Execute("page1.aspx");
но мне нужно передать данные POST на эту страницу.
Кто-нибудь знает, как я могу этого добиться? С сервера.Выполнение принимает только 3 параметра, и ни один из них не имеет ничего общего с данными POST.
Решение: 7 часов спустя…
К сожалению, единственным способом, которым я смог это сделать, было передать параметры в строке запроса (используя запрос GET). Я некоторое время искал в Интернете и, наконец, почувствовал, что этого достаточно для моего приложения. Я тестировал, и каким-то образом ограничение размера URL-адреса GET в 4K символов не подходит в этом контексте.
Я смог успешно выполнить сервер.Выполните метод с более чем 640 тысячами символов на другой странице, и он прекрасно сработал.
Server.Execute("~/pageB.aspx?foo=" new string('x', 640000));
На странице b: Page_Load();
Response.Write(Request["foo"].ToString().Length());
Результат: 640000
Так что, я думаю, на данный момент это должно быть сделано.
Я боялся необходимости отправлять большие параметры в строке запроса, но поскольку это работает, кто я такой, чтобы жаловаться ! 🙂
Ответ №1:
Является ли использование Server.Execute()
абсолютно необходимым?
Если нет, то для того, чтобы страница A была отправлена на страницу B, вы могли бы .PostBackURL
присвоить странице A значение страницы B, затем на странице B проверьте, является ли (this.PreviousPage != null)
; если это значение не равно null, то на странице B вы можете использовать что-то вроде this.PreviousPage.FindControl()
или ((PageA)this.PreviousPage).txtFirstName.Text
, чтобы получить входные значения.
Если некоторые значения не вводятся пользователем напрямую, вы все равно можете присвоить значения скрытым элементам управления и сделать эти скрытые элементы управления общедоступными свойствами страницы A, чтобы страница B могла получить к ним доступ после приведения .PreviousPage
к PageA
.
Если вы не хотите требовать типобезопасных ссылок на определенный отправляющий класс или интерфейс, самой простой альтернативой, вероятно, было бы использовать что-то вроде этого метода для инкапсуляции значений в контексте.Товары:
// to store in sending page:
Context.Items("UserName") = UserName.text;
// then call server.Transfer...
// to retrieve in receiving page:
string userName = (string)Context.Items("UserName");
Комментарии:
1. Мне нужно, чтобы PageB было прозрачно, какой метод использовался для его вызова. Кроме того, я не могу использовать AJAX, поскольку эта страница будет запущена в браузере, который не поддерживает javascript. Кроме того, я не могу использовать WebClient / HttpWebRequest, потому что я хочу, чтобы сеанс PageA / аутентификация / etc передавались на PageB
2. @Shiroy: В таком случае, вероятно, лучше всего установить переменные сеанса на странице A, а затем посмотреть их на странице B. В любом случае, когда страница отправки знает , что результаты будут использованы страницей получения, эта стратегия может сработать: создайте словарь сеанса с ключом «идентификатор записи». На странице A создайте / задайте идентификатор записи и создайте словарные записи для каждой переменной, затем перенаправьте на страницу B с идентификатором записи в строке запроса.
3. Создание сессионного словаря может быть рискованным, особенно при наличии нескольких обращений к одной и той же странице. Например, если PageA вызывает PageB 5 раз с разными параметрами. Кроме того, нет смысла обременять сеанс всеми этими дополнительными накладными расходами.
4. Я понимаю ваше отвращение к объектам сеанса, поэтому я добавил решение, основанное на контексте. Элементы и ссылка на довольно простую статью об этом. Надеюсь, это поможет!