Изменение ASP.NET MasterPage программно

У меня есть следующий код в моей стороне ASPX:

<%@ Page Language="C#" MasterPageFile="~/masterpages/standard.Master" .... %>
<%@ MasterType VirtualPath="~/masterpages/standard.Master" %>

Я использую VirtualPath для доступа к свойствам в моем MasterPage.Пока все хорошо.

Однако теперь я должен изменить masterpages программно. Я знаю, что для изменения основной страницы я должен сделать на page_init:

Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master";

Но я понятия не имею, того, как изменить VirtualPath.

9
задан Cœur 2 August 2017 в 23:02
поделиться

3 ответа

Я предполагаю, что вы используете MasterType, потому что вам нужно какое-то свойство (которое вам также понадобится, если вы перейдете на другой мастер), допустим, вы сейчас используете Master. MyButton, переместите его в базовый класс и используйте этот тип в объявлении @MasterType:

public class MasterBase : MasterPage
{
  public Button MyButton;
}

public class standard : MasterBase
{
}

Теперь на вашей странице объявление MasterType выглядит так:

<%@ MasterType TypeName="MyNameSpace.MasterBase" %>

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

2
ответ дан 3 November 2019 в 07:47
поделиться

Сделали некоторое рытье и нашли это на Форумах ASP.NET:

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

Затем вы можете использовать эту базовую MasterPage введите как тип MasterType для страницы.

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

С уважением,

Анас Ганем

Кажется довольно разумным подходом, пока вы можете жить, делая некоторые кастинги.

Источник


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

MasterPage CurrentMaster;
if (Page.MasterPageFile == "Master1") {
  CurrentMaster = (Master1Type)Page.MasterPage;
} 
else {
  CurrentMaster = (Master2Type)Page.MasterPage;
}

Источник

0
ответ дан 3 November 2019 в 07:47
поделиться

Короче говоря, вы не можете этого сделать.

Как видите, каталог MasterType предоставляет информацию о типе , которая используется компилятором во время компиляции.

Когда вы пишете что-то вроде Page.MasterPage.btn1.Text = "abcd" , компилятор должен знать, как обрабатывать эту часть "btn1". Что это? Это поле? Недвижимость? Метод? Вложенный класс? Или, может быть, его вообще не существует?

Чтобы ответить на эти вопросы, компилятор должен знать тип выражения Page.MasterPage . И это именно то, что вы предоставляете с помощью директивы MasterType.

Атрибут VirtualPath в основном говорит: «Сначала скомпилируйте этот другой файл, и результатом его компиляции будет тип свойства Master этой страницы». Вот как знает компилятор.

Из всего вышесказанного можно сделать вывод: не только невозможно изменить тип какого-либо свойства во время выполнения, но и не имеет смысла - код уже скомпилирован, вам не нужно больше никакой информации во время компиляции!

Итак, возникает следующий вопрос: почему вы вообще хотели это сделать ?

Если вы просто хотите использовать разные свойства, объявленные на разных главных страницах, вы может воспользоваться советом Ника Крейвера и Натана Тейлора и объявить базовый класс, который будет иметь все эти поля / свойства и унаследовать все ваши главные страницы от этого базового класса, а затем указать в директиве MasterType этот базовый класс через атрибут TypeName.

Однако я бы пошел этим путем, только если обе главные страницы похожи по логике, только по дизайну. То есть одна страница не должна иметь никаких свойств, которых нет у другой. В противном случае просто неправильно иметь два подмножества свойств / методов / полей в одном классе (который будет базовым классом), когда только один из этих подмножеств используется в любое время. И неправильно создавать общую базу для двух классов, когда на самом деле общей базы нет. Он же «плохой дизайн». В этом случае вам, вероятно, следует пересмотреть свой первоначальный дизайн.

Если у вас другая цель - объясните, пожалуйста, и я постараюсь предложить вам какие-то решения.

Удачи с этим.

  • Fyodor
2
ответ дан 3 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: