2009-06-02 22 views
7

私は "Master" Masterpageを持っています。私は2つの "Sub" Masterpagesを持っています。これらの2つのサブのmasterpageプロパティは、 "Master" Masterpageに設定されています。これまでのすべての良い。Masterpagesと継承を使用したマスターページ

私は今日、Sub1とSub2をMaster Masterpageから実際に "継承"させるように言われました。私は、彼らが彼らの言語との不正確されていたと思ったが、いや、彼女は私が

public partial class Sub2 : TheMaster 

(これらの名前ではありません)に、クラスの定義を変更するようでした。

だから、今、私は

をマスターページですSUB1とSUB2を得、そしてザ・マスターのマスターページを持っており、また、彼らは「ザ・マスター」のクラスでありました、私は、これでかなり混乱していますこれがどのような影響を及ぼすかは不明です。今コンパイルしてうまくいくようですが、今日この6ヶ月のプロジェクトを開始しています。私は5ヶ月目に入り、大きな設計上の欠陥があることを知りたくありません。

誰も私がこれが完全にうまくいっているとか、私たちが完全にうんざりしていると言ってもらえますか?

私は怖いです...私を抱きしめてください。

EDIT:明確化 - 私がマスターマスターページから継承したかった理由は、そのページにいくつかのものを設定し、それらをサブマスターページで使用できるようにすることです。レンダリングされたページが存在するサイトマップ内の現在のノードのようなもの、ユーザーアカウントのものなど

+0

マスターページにマスターページがあるのは少し奇妙です。マスターページには、通常、メイン,およびタグが含まれています。サブマスターページにもそれが含まれていますか? – Ropstah

+0

Nope。メインページには、あなたが言及したものすべてと、サイト全体にわたって一定であるヘッダーとフッターのdivが含まれています。サブマスター1にはコンテンツ本体の3列のレイアウトが含まれ、サブマスター2には2列のレイアウトが含まれています(実際には他のものもあります)。 –

答えて

1

基本的には、指定されたベースからすべてのアイテムを継承するようにページを設定するだけです。 「Masterpage」プロパティのフックアップは弱い関連付けを作成し、特定の構造体の内部にコンテンツをレンダリングします。ベースから継承するクラスは、ロジックを前方に移動させ、実行するだけでなくオーバーライドすることができます。

今、それについて考えた後、あなたが最も可能性が高い....マスターページプロパティセットを望んでいないが、単にクラス継承

+0

さて、なぜですか?マスターページプロパティを設定したくない場合は、マスターマスターページにコンテンツ領域を指定してから、それらの領域を使用してサブマスターページに新しいコンテンツ領域を指定する方法はありますか? –

+0

全体的には、サブページが親のメソッド機能をオーバーライドする必要がある場合は、あなたがやろうとしていることに依存しますが、ちょっとしたことがあります。情報が必要な場合は、メインページにアイテムを公開し、this.parentを参照してそれらにアクセスしてください。 –

4

マスターページを入れ子になっていることが実際に可能である - 参照のためhttp://msdn.microsoft.com/en-us/library/x2b3ktt7.aspxを参照してください。私はあなたのサブマスターページが背後にあるコードでメインマスターページから継承されなければならないとは思わないコメント

あたりとして

EDIT。

サブマスターページを含む各マスターページは、マスターページから直接継承する必要があります(public partial class Sub1 : System.Web.UI.MasterPage)。

のみサブマスターページのASPマークアップがメインのマスターページを参照しなければならない、すなわち<%@ Master Language="C#" MasterPageFile="~/TheMaster.master" ... />

あなたのサブマスターページはVS UIを介してプロジェクトに追加する場合は、マスターページとしてTheMaster.master選択あなたはこれがどのように設定されているかを見るでしょう。マスターページの使用法は、クラスの継承を介さずに、コンテンツ(マークアップ)を介してのみ使用するように設計されています。

+0

私はそれが可能であることを知っています。私は私のポストでそれを述べた。どのようにセットアップして、どのように動作しているかを伝えました。私の質問は、マスターページを指定していて、同じマスターページから継承するべきです。 –

+0

+1 "マスターページの使用は、クラス継承を介さずにコンテンツ(マークアップ)を介してのみ行うように設計されています。"これは、クラスロジックをマスターページに合わせようとすると、もっと時間を無駄にするのを免れました。 – palswim

2

私はちょうどこれに遭遇し、ネストしているマスターページから継承するときに実行する特定の問題を追加したかったのです。たとえば、次のコードは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を使用しています。せいぜい、これはハックであり、多くの場合、それはより多くの作業と重複を作り出すでしょう。

代わりに、目的のアプリケーション機能を持つ仮想マスターページ基本クラスを作成し、各マスターページにこのクラスを継承させることもできます。私は、仮想ページベースクラスを使用してこれを使用することには、非常に限定された利点のみを見ることができ、多くの欠点があります。おそらくマスターページを使って、マークアップでの複製を減らし、残りの必要な機能をページクラスに入れるのが最善です。

関連する問題