ASP.Net Изменить MasterPage Программно

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

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

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

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

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

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

3 ответов


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

public class MasterBase : MasterPage
{
  public Button MyButton;
}

public class standard : MasterBase
{
}

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

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

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


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

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

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

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

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

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

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

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

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

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

удачи с этим.

  • Федор

сделал некоторые раскопки и нашел это на ASP.NET форумы:

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

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

см. раздел " сильная типизация для Dynamic Master Раздел "страницы" в этом ссылке.

С уважением,

Anas Ганем!--2-->

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

источник


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

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

источник