2011-08-04 6 views
4

私が何か間違っていると私は啓発されたいと思います。私は賭ける。ASP.NET MVCでは@RenderSection(@RenderPageと対比)を使用する利点は何ですか?

私は私のビューページに次のコードがある場合:

@{ 
    ViewBag.Title = "About Us"; 
} 

<h2>About</h2> 
<p> 
    sample content. 
</p> 
@section header 
{ 
    <div id="header"> 
     Chapter 3a: Creating a Consistent Look 
    </div> 
} 

を...私もランで例外を防ぐために、セクション(使用可能な場合)をレンダリングするために私のレイアウトページにFFを持つべきです時間:しかし

@if (IsSectionDefined("header")) 
{ 
    @RenderSection("header") 
} 

、私はそれがセクションをレンダリングする前にセクションをチェックする上での最後の4行を持っていない場合(たとえば、私はそれらすべてをコメントし)、コンパイラは私がセクションを持っていることをチェックしません私のビューページで定義され、アプリケーションをビルドして実行できるようにします。実行時に、それは私がページを実行すると、私はこのエラーを取得することだけにしている:

次のセクションでは、定義されているが、レイアウトページ「〜のために にレンダリングされていない/閲覧/共有/ _Layout2.cshtml ":"ヘッダー "。

私の質問は、FFです:

  1. どのように我々はこれを防ぐことができますか?コンパイラが0x37コードがないかどうかを強制的にチェックする設定がありますか?
  2. アプリケーション全体で@sectionキーワードの存在を手動で検索する必要があるため、@section機能を使用すると、システムの保守性が低下します(質問#1に肯定的な回答がないと仮定します)。
  3. この場合、@RenderPageではなく@RenderSectionを使用する利点は何ですか?
  4. @sectionも条件付きにすることはできますか?

答えて

2

私はこれを問題として考えたことはありません。コンセプトはaspx構文のプレースホルダと同じです。したがって、ホームページに2つのプレースホルダがある場合、そのマスターページを使用して各ページ/ビューに2つのコンテンツがあるはずです。

議論にPhil Haackのブログ記事がありますが、あなたの懸念事項に直接言及していませんが、それは確かに面白いことです。

http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx

+0

迅速な回答ありがとうございます。私が理解しているところから、プレースホルダの概念との関係については、プレースホルダオブジェクトが存在するか否かはサーバー側コードでチェックされます(プレースホルダオブジェクトはコードプレースホルダオブジェクトを使用できませんあなたのページに存在する)、コンパイル時に文字列(例えば "ヘッダ")はチェックされません。私はあなたのプレースホルダの使い方を正しく理解していることを願っています。ありがとう! – nolisj

+0

実際はそうではありません。それはどのように動作するのではありません。コードビハインドはまったく関連していません。実際には、Mvc2 aspxビューはコードビハインドファイルをも持っていないので。つまり、概念レベルでは、タグは@RenderSection()ステートメントと同等で、タグは@section {}宣言と同等です。私は彼らがまったく同じように働いていることを暗示していませんでした。それでもコンパイル時に2人のうちの誰もチェックされていないと確信しています。 csprojでタグをtrueに設定し、何か改善が見られるかどうか試してみてください。 –

+0

私はあなたが意味することを理解しています。私はあなたがこのプレースホルダ()よりもこのプレースホルダ()を参照していると思っていました。 類似点(ContentPlaceHolder == @RenderSection(); Content == @section)については、私が理解する限り正しいと思われます。しかし、ContentPlaceHolder/Contentのペアを@RenderSection()/ @セクションのペアと異なるものにするのは、ContentPlaceHolder/Contentのペア(およびそれらの互いの関係)が@RenderSection()/ @よりも明白であることです。セクションのペア。 – nolisj

2

誰かがこれで通過した場合、私はその昔を知っているが。

@RenderSection( "header"、必須:false)これにより、ビューページに @sectionヘッダー{}を含めるかどうかを指定できます。

これで、レイアウトからチェック条件を削除することもできます。 これも条件付き!

@RenderSection( "header"、required:true)ただし、ビューに@sectionヘッダーがない場合は、エラーが発生します。

関連する問題