7

は、私は現在、MVC 6.私は、次のコードを移行する方法をMVC 6でどのようにデフォルトのコンテンツでセクションを定義できますか?

にASP.net MVC 5プロジェクトを移行しようとしています:

public static class SectionExtensions 
{ 
    public static HelperResult RenderSection(this WebPageBase webPage, [RazorSection] string name, Func<dynamic, HelperResult> defaultContents) 
    { 
     return webPage.IsSectionDefined(name) ? webPage.RenderSection(name) : defaultContents(null); 
    } 
} 

は[RazorSection] JetBrains.Annotationsアセンブリの一部です。

答えて

6

代わりのWebPageBase私はその後、かみそりページ@using static Stackoverflow.SessionExtensionsでクラスを参照し、そのようにそれを呼び出すMicrosoft.AspNet.Mvc.Razor

namespace Stackoverflow 
{ 
    public static class SectionExtensions 
    { 
     public static IHtmlContent RenderSection(this RazorPage page, [RazorSection] string name, Func<dynamic, IHtmlContent> defaultContents) 
     { 
      return page.IsSectionDefined(name) ? page.RenderSection(name) : defaultContents(null); 
     } 
    } 
} 

RazorPageを使用:代替の方法は、になり

@this.RenderSection("extra", @<span>This is the default!</span>)) 

ビューでこれを行うだけです(私はこの方法が好きです、もっと簡単に見えるでしょう):

@if (IsSectionDefined("extra")) 
{ 
    @RenderSection("extra", required: false) 
} 
else 
{ 
    <span>This is the default!</span> 
} 

これが役立ちます。

アップデート1(コメント)

は、名前空間

@using Stackoverflow 

を参照することにより、あなたはstaticキーワードを含める必要はありませんが、それを呼び出すときに、あなたが実際に参照する必要があります関数に 'this'を渡します。

@SectionExtensions.RenderSection(this, "extra", @<span>This is the default!</span>) 

アップデート2

あなたはセクション内のテンプレート代表者Func <dynamic, object> e = @<span>@item</span>;を呼び出すことはできませんかみそりのバグがあります。 https://github.com/aspnet/Razor/issues/672

現在の回避策を参照してください。

public static class SectionExtensions 
{ 
    public static IHtmlContent RenderSection(this RazorPage page, [RazorSection] string name, IHtmlContent defaultContents) 
    { 
     return page.IsSectionDefined(name) ? page.RenderSection(name) : defaultContents; 
    } 
} 

、その後、かみそりのページ:応答のための

section test { 
    @this.RenderSection("extra", new HtmlString("<span>this is the default!</span>")); 
} 
+0

感謝を。私は単にビューの外にあるステートメントを保持したいので、代わりの方法が好きではありません。あなたが言及したことを試しましたが、すべてが名前空間を除いて動作するようです。 this.RenderSectionの代わりにSectionExtensions.RenderSectionを使用する必要があるようです。 usingステートメントは何もしないようですか? –

+0

私の前回の編集が何らかの理由で私の答えを更新しました。静的クラスを直接参照するには、静的キーワードegを使用します。 '@using static Stackoverflow.SessionExtensions'、ただし、名前空間を参照するだけの場合は、静的などを追加する必要はありません。 '@using Stackoverflow'。名前空間全体をビューに含めるかどうかは、すべてに依存します。その場合、 '@ this.RenderSection'の代わりに '@ SessionExtension.RenderSection'を呼び出して、RenderSection関数(this、 "test"、@ default)に 'this'を渡す必要があります。それが役に立ったら教えてください。 –

+0

私はこれが働いていると思ったが、問題にぶつかった。ネストされたレイアウトがあるとします。MasterLayoutに標準@RenderSection( "test"、false)があります。次に、MasterLayoutを継承するSubMasterLayoutがあります。私は @sectionテストしようとすると、{SectionExtensions.RenderSection @ ( @この、「余分な」、これがデフォルトです!) } 私は次の例外を取得 :「__razor_template_writer」:パラメータまたはローカル変数はできませんメソッド型パラメータと同じ名前を持つ これはMVC5で完全に機能しましたか? –

関連する問題