Alex Belozerov Blog

IT, бизнес, саморазвитие

ASP.NET: Redirect с параметром без QueryString

Столкнулся с ситуацией, когда необходимо сделать Redirect на другую страницу, передав при этом параметр, но так, чтобы не видел пользователь. То есть простая передача через QueryString - Response.Redirect(“~/NewPage.aspx?id=5”) - не подходит.

Я придумал решение, используя QueryString и Session:

Пример:
надо передать параметр id на страницу NewPage.aspx

Сам редирект делаем как обычно, параметр передаем через QueryString.
Response.Redirect("~/NewPage.aspx?id=5")

Но принимающая страница по-особому обрабатывает запрос:
public partial class NewPage : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (Session["NewPage_id"] != null)
{
// Второй запрос приходит сюда
int id = Int32.Parse(Session["NewPage_id"].ToString());
// Используем id
// ...

// Освобождаем память
Session["NewPage_id"] = null;
}
else if (Request["id"] != null)
{
// Первый запрос приходит сюда
Session["NewPage_id"] = Request["id"];
// Редирект без QueryString
Response.Redirect(GetUriWithoutQueryStr(Request.Url), true);
}
}

public string GetUriWithoutQueryStr(Uri url)
{
return url.GetLeftPart(UriPartial.Path);
}
}
Мы сохраняем пришедший параметр в сессию, и редиректимся на эту же страницу без QueryString. При второй загрузке параметры спокойно извлекаются из сессии и используются. Пользователь, естественно, в строке запроса никаких параметров не видит.
После извлечения параметра лучше сразу удалить его из сессии, чтобы он не повлиял на последующие запросы.

А как вы решали подобную задачу? :-)

Archived comments

alex
Вы правы, в рамках одного веб-приложения хранение в Session и Server.Transfer покрывают все возможные ситуации

Однако представьте, что нужно отправить форму удаленному серверу, и ответом должен быть редирект на другую страницу с необходимыми параметрами. И мы хотим, чтобы ползователь параметров не увидел. Вот тут-то и пригодится способ, описанный в этой статье.
Руслан
А еще лучше Server.Transfer() использовать - так меньше ресурсов жрем. Но опять же в рамках одного приложения
Roman2311
Понятно.

Ну может тогда через твиттер передавать параметры :)
alex
Важное замечание, Роман!

Действительно, нет смысла так извращаться, если редирект происходит на страницу, находящуюся в том же web-приложении (т.е. обе страницы имеют доступ одной и той же Session).

Мой способ может пригодиться, если редирект приходит с другого сервера
Roman2311
Может я что-то не так понял, но почему бы просто не сделать:


Session["NewPage_id"] = 5;
Response.Redirect("~/NewPage.aspx");


Я нутром чувствую, что все на так просто… но все же

Comments