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;
}