Сегодня я получил новое требование: для нашей страницы продукта они хотят использовать совершенно другой макет в зависимости от типа продукта.
Например, скажем, мы продаем ведра. В настоящее время все сегменты используют один и тот же макет страницы. Но теперь они хотят, чтобы деревянные ведра использовали текущую компоновку, а пластиковые ведра использовали совершенно другую компоновку. Однако они хотят, чтобы URL-адреса оставались прежними (например, domain.com/bucket/1), поэтому я не могу просто перенаправить пластиковые ведра на новую страницу.
Текущая структура страницы выглядит следующим образом:
CurrentMasterPage.master > CurrentProductPage.aspx > Several UserControls
Для нового макета требуются новые страницы (т. е. ни одна из текущих не используется повторно):
NewMasterPage.master > NewProductPage.aspx > Several UserControls
Моей первой мыслью было взять всю разметку и код из CurrentProductPage.aspx и поместить их в UserControl, затем создать второй UserControl для нового макета (NewProductPage.aspx) и заставить CurrentProductPage.aspx динамически загружать соответствующий UserControl на основе тип продукта, однако это не работает, потому что для нового макета требуется новая мастер-страница, и я не могу ссылаться на мастер-страницу из пользовательского элемента управления.
Затем я подумал об использовании перезаписи URL-адресов, но я не думаю, что один и тот же URL-адрес загружает две разные страницы.
Есть ли способ сделать это?
Почему бы не использовать 100% редирект на стороне сервера?
Когда вы используете response.Redirect("какая-то другая страница"). Затем браузеру на стороне клиента отправляется совершенно новая копия этой страницы, и URL-адрес будет обновлен.
Однако серверная сторона может записать любую страницу, которую захочет. Клиентская сторона даже не узнает, что сервер решил создать другую страницу для данного URL.
Таким образом, у вас может быть страница с поддельными вкладками в качестве кнопок. Когда пользователь нажимает кнопку, начинается обход браузера (для заданного URL-адреса). Но на стороне сервера вы можете создать другую страницу для этого URL.
Итак, вместо этого классического «путешествия туда и обратно» вы можете использовать:
Server.TransferRequest("MyotherWebPage")
Таким образом, для заданного URL-адреса, прежде чем текущая страница (на основе заданного URL-адреса) будет отправлена обратно в браузер, приведенное выше просто выдаст другую страницу. Текущая страница никогда не вернется обратно в браузер.
Фактически, для богатой страницы с большим количеством кнопок и функций вы можете изменить отображаемую страницу. Итак, при загрузке - просто вместо "response.Redirect" используйте server.Transfer. Текущая страница никогда не доходит до клиента — ту, куда вы отправляете. Поскольку клиентская сторона не имеет ни малейшего представления о том, что веб-сервер решит выдать, она также не будет иметь ни малейшего представления о том, что другая страница была отправлена обратно клиенту.
Попробуйте вышеописанное с тестовой страницей.
На странице A за стандартной кнопкой перейдите на веб-страницу B.
например:
Response.Recdirect("MyPageB.aspx")
Обратите внимание на изменение URL-адреса — классический круговой маршрут.
Теперь сделайте это с помощью кнопки:
Server.Redirect("MyPageB.aspx")
В этом случае полного обхода не происходит. Сервер переходит непосредственно на новую страницу и отправляет ее. (и обратите внимание, что ваш URL-адрес НЕ меняется).
Вы можете изменить Мастер-страницу на PreInit
на Странице с помощью Мастера. Это возможно, потому что мастер в основном такой же, как пользовательский элемент управления, и загружается ПОСЛЕ кода страницы.
protected void Page_PreInit(object sender, EventArgs e)
{
if (NewProductPage)
{
MasterPageFile = "~/NewMasterPage.master";
}
}