私が何か間違っていると私は啓発されたいと思います。私は賭ける。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です:
- どのように我々はこれを防ぐことができますか?コンパイラが0x37コードがないかどうかを強制的にチェックする設定がありますか?
- アプリケーション全体で
@section
キーワードの存在を手動で検索する必要があるため、@section
機能を使用すると、システムの保守性が低下します(質問#1に肯定的な回答がないと仮定します)。 - この場合、
@RenderPage
ではなく@RenderSection
を使用する利点は何ですか? @section
も条件付きにすることはできますか?
迅速な回答ありがとうございます。私が理解しているところから、プレースホルダの概念との関係については、プレースホルダオブジェクトが存在するか否かはサーバー側コードでチェックされます(プレースホルダオブジェクトはコードプレースホルダオブジェクトを使用できませんあなたのページに存在する)、コンパイル時に文字列(例えば "ヘッダ")はチェックされません。私はあなたのプレースホルダの使い方を正しく理解していることを願っています。ありがとう! – nolisj
実際はそうではありません。それはどのように動作するのではありません。コードビハインドはまったく関連していません。実際には、Mvc2 aspxビューはコードビハインドファイルをも持っていないので。つまり、概念レベルでは、 タグは@RenderSection()ステートメントと同等で、タグは@section {}宣言と同等です。私は彼らがまったく同じように働いていることを暗示していませんでした。それでもコンパイル時に2人のうちの誰もチェックされていないと確信しています。 csprojでタグをtrueに設定し、何か改善が見られるかどうか試してみてください。 –
私はあなたが意味することを理解しています。私はあなたがこのプレースホルダ()よりもこのプレースホルダ()を参照していると思っていました。 類似点(ContentPlaceHolder == @RenderSection(); Content == @section)については、私が理解する限り正しいと思われます。しかし、ContentPlaceHolder/Contentのペアを@RenderSection()/ @セクションのペアと異なるものにするのは、ContentPlaceHolder/Contentのペア(およびそれらの互いの関係)が@RenderSection()/ @よりも明白であることです。セクションのペア。 –
nolisj