7

Ich versuche derzeit ein ASP.net MVC 5 Projekt MVC 6.Wie können Sie Abschnitte mit Standardinhalt in MVC 6 definieren?

Wie würde ich wandern Sie den folgenden Code zu migrieren:

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] Teil der JetBrains.Annotations Baugruppe ist.

Antwort

6

Statt WebPageBase benutzen ich RazorPage in 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); 
     } 
    } 
} 

dann die Klasse auf der Seite der Rasiermessers Referenz @using static Stackoverflow.SessionExtensions, und es wie so nennen:

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

Ein alternativer Weg sein würde tun Sie einfach dies in der Ansicht (Ich bevorzuge diesen Weg, scheint viel einfacher):

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

Ich hoffe, das hilft.

Update 1 (von Kommentaren)

durch den Namespace referenzieren

@using Stackoverflow 

Sie müssen nicht schließen die static Schlüsselwort, aber wenn es ruft, werden Sie die aktuelle Referenz müssen Klasse im Namensraum und auch "diese" in die Funktion.

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

Update 2

Es ist ein Fehler in Rasierer, die nicht zulässt Vorlage Delegierten Func <dynamic, object> e = @<span>@item</span>; innerhalb eines Abschnitts nennen. Bitte beachten Sie https://github.com/aspnet/Razor/issues/672

Eine aktuelle Problemumgehung:

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

und dann das Messer Seite:

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

Vielen Dank für die Antwort. Ich mag den alternativen Weg einfach nicht, weil ich gerne Aussagen außerhalb des Views behalte. Ich habe versucht, was du erwähnt hast und alles scheint zu funktionieren, außer für den Namensraum. Es scheint, als müsste ich: SectionExtensions.RenderSection anstelle der this.RenderSection verwenden. Die using-Anweisung scheint nichts zu tun? –

+0

Ich habe meine Antwort aktualisiert, aus irgendeinem Grund ging meine vorherige Bearbeitung nicht durch. Um direkt auf eine statische Klasse zu verweisen, verwenden Sie das Schlüsselwort static. '@ using static Stackoverflow.SessionExtensions', wenn Sie jedoch nur auf den Namespace verweisen, müssen Sie keine statischen hinzufügen z. "Verwendung von Stackoverflow" Es kommt darauf an, ob Sie den gesamten Namespace in Ihre Ansicht einbeziehen möchten. In diesem Fall müssen Sie '@ SessionExtension.RenderSection' anstelle von '@ this.RenderSection' aufrufen und dann 'this' in die Funktion RenderSection (dies ist "test", @ default) übergeben. Lass es mich wissen, wenn das hilft. –

+0

Ich dachte, das würde funktionieren, aber ich bin auf ein Problem gestoßen. Sagen wir, Sie haben ein verschachteltes Layout.Im MasterLayout haben Sie einen Standard @RenderSection ("test", false). Dann haben Sie ein SubMasterLayout, das das MasterLayout erbt. Wenn ich @section Test try { @ SectionExtensions.RenderSection (diese "extra", @ ist dies die Standard!) } ich die folgende Ausnahme erhalten: '__razor_template_writer': einen Parameter oder eine lokale Variable kann nicht haben denselben Namen wie ein Methodentyp-Parameter. Dies funktionierte perfekt in MVC5? –

Verwandte Themen