MasterPage с использованием Masterpages и наследование

У меня есть главная мастер-страница и 2 вспомогательные мастер-страницы. Эти 2 подпрограммы имеют свойство masterpage, установленное на "Master" Masterpage. Пока все хорошо.

Что ж, сегодня мне сказали сделать так, чтобы Sub1 и Sub2 фактически «унаследовали» от Master Masterpage. Я думал, что они неточно говорят на своем языке, но нет, она хотела, чтобы я изменил определение класса на

public partial class Sub2 : TheMaster 

(это не имена).

Итак, теперь у меня есть Sub1 и Sub2, которые являются главными страницами, и у меня есть главная страница TheMaster, и ТАКЖЕ они относятся к классу «TheMaster».

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

Может ли кто-нибудь сказать мне, что это совершенно нормально или что мы совсем запутались?

Я боюсь ... держи меня.

РЕДАКТИРОВАТЬ: Уточнение - причина, по которой она хотела, чтобы я также наследовал от главной мастер-страницы, заключается в том, что мы установили некоторые вещи на этой странице, и мы хотим, чтобы они были доступны для подчиненных мастер-страниц. Такие вещи, как текущий узел в карте сайта, которым является отображаемая страница, некоторые сведения об учетной записи пользователя и многое другое.


person Matt Dawdy    schedule 02.06.2009    source источник
comment
Немного странно, что у вас есть мастер-страница на мастер-странице. Главная страница обычно содержит основные теги ‹html›, ‹head› и ‹body›. Есть ли они на вашей подмастерной странице?   -  person Ropstah    schedule 03.06.2009
comment
Неа. Главная страница содержит все, что вы упомянули, а также div верхнего и нижнего колонтитула, которые являются постоянными для всего сайта. Подмастер 1 содержит макет для 3 столбцов в теле контента, а подчиненный мастер 2 содержит макет из 2 столбцов (и некоторые другие вещи, на самом деле)   -  person Matt Dawdy    schedule 03.06.2009


Ответы (3)


По сути, вы настроили страницу так, чтобы класс наследовал все элементы из указанной базы. Подключение свойства Masterpage создает слабую ассоциацию и отображает контент внутри определенной структуры. Класс, унаследованный от базового, продвигает логику вперед таким образом, чтобы вместо того, чтобы просто выполнять ее, вы можете ее переопределить.

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

person Mitchel Sellers    schedule 02.06.2009
comment
Хорошо, а почему? И как мне указать области содержимого на главной главной странице, а затем использовать эти области и указать новые области содержимого на подчиненных главных страницах, если я не хочу, чтобы свойство главной страницы устанавливалось? - person Matt Dawdy; 03.06.2009
comment
В целом, это зависит от того, что вы пытаетесь сделать, если подстраницам необходимо переопределить функциональность родительского метода, тогда вы попадаете в небольшую хитрость. Если вам просто нужна информация, сделайте элементы общедоступными на главной странице и сделайте ссылку на this.parent, чтобы получить к ним доступ. - person Mitchel Sellers; 03.06.2009

Действительно, можно иметь вложенные главные страницы - см. http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx для справки.

ИЗМЕНИТЬ согласно комментарию

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

Каждая главная страница, включая подчиненные мастер-страницы, должна наследовать непосредственно от MasterPage, то есть public partial class Sub1 : System.Web.UI.MasterPage.

Только разметка ASP подчиненной главной страницы должна ссылаться на главную главную страницу, т. Е. <%@ Master Language="C#" MasterPageFile="~/TheMaster.master" ... />

Если вы добавите свою подчиненную главную страницу в проект через пользовательский интерфейс VS, выбрав TheMaster.master в качестве главной страницы, вы увидите, как все настроено. Использование главной страницы предназначено для использования только через контент (разметку), а не через наследование классов.

person Adam Ralph    schedule 02.06.2009
comment
Я знаю, что это возможно. Я заявил об этом в своем посте. Я рассказал вам, как я его настраиваю, и рассказал, как он работает. Мои вопросы были больше в направлении ДОЛЖЕН ли я указывать главную страницу и наследовать от одной и той же главной страницы? - person Matt Dawdy; 03.06.2009
comment
+1 для использования главной страницы предназначен только для использования через контент (разметку), а не через наследование классов. Это помогло мне перестать тратить больше времени на попытки уместить логику класса в мастер-страницы. - person palswim; 25.06.2016

Я только что столкнулся с этим и хотел добавить конкретные проблемы, с которыми вы столкнетесь при наследовании от главных страниц, которые вы также встраиваете. Например, следующий код в BaseMaster.master.cs:

//BaseMaster.master.cs
public String FooLabelText
{
    get { return FooLabel.Text; }
    set { FooLabel.Text = value; }
}

при вызове с вашей унаследованной страницы выдает NullReferenceException. FooLabel (метка в вашем BaseMaster.master файле) не существует на вложенной главной странице (SubMaster.master), поэтому, если вы получите доступ к этому свойству, оно сломается.

Вы можете обойти это, переопределив свойство в своем подклассе и перенаправив его на главную страницу, в которую вы вложены, но это действительно нарушает философию дизайна главных страниц .NET:

//SubMaster.master.cs inherits from BaseMaster
new public String FooLabelText
{
    get { return (Master as BaseMaster).FooLabel.Text; }
    set { (Master as BaseMaster).FooLabel.Text = value; }
}

Обратите внимание, что я использую не base.FooLabel, а Master.FooLabel, который на самом деле указывает на другой объект. В лучшем случае это взлом, и во многих случаях он создаст больше работы и дублирования.

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

person Kendrick    schedule 08.12.2010