MasterPage с использованием мастер-страниц и наследования - PullRequest
7 голосов
/ 03 июня 2009

У меня есть мастер-страница "Master", и у меня есть 2 мастер-страницы "Sub". Этим двум подпрограммам присвоено свойство мастер-страницы «Мастер». Пока все хорошо.

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

public partial class Sub2 : TheMaster 

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

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

Меня это смущает, и я не уверен, какие эффекты это будет иметь. Похоже, что сейчас он компилируется и работает нормально, но мы только начинаем этот 6-месячный проект сегодня, и я не хочу переходить к 5-му месяцу и выяснять, что у нас есть серьезный недостаток дизайна.

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

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

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

Ответы [ 3 ]

5 голосов
/ 03 июня 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 в качестве главной страницы, то вы увидите, что так все настроено. Использование главной страницы предназначено только для содержимого (разметки), а не для наследования классов.

2 голосов
/ 08 декабря 2010

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

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

1 голос
/ 03 июня 2009

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

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

...