Можно ли динамически загружать страницу .aspx?

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

Например, скажем, мы продаем ведра. В настоящее время все сегменты используют один и тот же макет страницы. Но теперь они хотят, чтобы деревянные ведра использовали текущую компоновку, а пластиковые ведра использовали совершенно другую компоновку. Однако они хотят, чтобы 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-адрес загружает две разные страницы.

Есть ли способ сделать это?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Почему бы не использовать 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";
    }
}

Другие вопросы по теме