2017-08-17 7 views
0

TL; DR Sind "Teilseiten" in ASP.NET Core 2.0 möglich? Wenn ja, warum erhalte ich den unten beschriebenen Fehler?Teilseiten in ASP.NET Core 2.0

Ich habe mit der neuen Funktion Razor Page von ASP.NET 2.0 und Probleme mit Partials. Die oben verlinkte Dokumentation bezieht sich auf "Partials" an mehreren Stellen, aber nur so weit, mystische Dinge zu sagen wie "Die Layouts, Vorlagen und Partials, die Sie mit MVC-Controllern und konventionellen Razor Views verwenden funktionieren einfach." Meinten sie partial Views, wie wir es gewohnt sind, oder eine neue Art von Teil-Seite auch? Sie zeigen, dass Dateien mit dem herkömmlichen Partial Suffix im Namen in den Ordner Pages/ platziert werden können, aber die Dateien, die sie erwähnen (z. B. _ValidationScriptsPartial.cshtml) haben nicht die @page Deklaration. Wenn „Teil Pages“ in der Tat eine neue Sache ist, dann würde ich das folgende Minimalszenario erwarten zu arbeiten:

  • eine Auslagerungsdatei Derp.cshtml genannt:

    @page 
    @namespace MyApp.Pages 
    @model DerpModel 
    
    <p>Member 1: @Model.Member1</p> 
    <p>Member 2: @Model.Member2</p> 
    
  • Eine Klassendatei Derp.cshtml.cs in dem genannten Verzeichnis (unter dem ersten in VS 2017 Solution Explorer verschachtelt), die folgende Klasse enthält:

    namespace MyApp.Pages { 
        public class DerpModel : PageModel { 
         public void OnGet() { 
          Member1 = "Derp Member1"; 
          Member2 = "Derp Member2"; 
         } 
    
         public string Member1 { get; set; } 
         public string Member2 { get; set; } 
        } 
    } 
    
  • Ein zweiter P Alte Datei DerpWrapper.cshtml im selben Verzeichnis mit dem Namen, mit dem folgenden Code:

    @page "{id}" 
    @namespace MyApp.Pages 
    @model DerpModel 
    
    <p>Outer Member 1: @Model.Member1</p> 
    <p>Outer Member 2: @Model.Member2</p> 
    @Html.Partial("Derp", Model) 
    
  • Und natürlich eine _ViewImports-Datei, die @namespace MyApp.Pages

Hinweis erklärt, dass beide Razor Seiten haben den gleichen @model Typen und Die zweite Seite schließt im Grunde die erste mit einem Anruf an Html.Partial() und übergibt ihre Model. Dies sollte alles ziemlich Standard-Zeug sein, aber beim Navigieren zu http://localhost:xxx/DerpWrapper, bekomme ich eine 500 Antwort aufgrund einer NullReferenceException mit dem folgenden Stack-Trace.

MyApp.Pages.Derp_Page.get_Model() 
    MyApp.Pages.Derp_Page+<ExecuteAsync>d__0.MoveNext() in Derp.cshtml 
    + 
    <p>Inner Member1: @Model.Member1</p> 
    ... 
    MyApp.Pages.DerpWrapper_Page+<ExecuteAsync>d__0.MoveNext() in DerpWrapper.cshtml 
    + 
    @Html.Partial("Derp", Model) 
    ... 

Warum wird die "Wrapper" Model Seite gleich null? Gibt es keine Möglichkeit, eine Rasiererseite zu definieren und sie von einer anderen Seite oder Ansicht mit Html.Partial() anzuzeigen?

+0

Ich bin nicht wirklich vertraut mit ASP.NET Core, aber bewirkt die neue '@ page' Direktive nicht, dass eine Seite sich wie eine Aktion verhält? Das würde bedeuten, dass * eine Kinderaktion verwendet werden muss, um sie einzubetten. Teilweise, aber wer weiß. Wie auch immer, ** Ich würde nur versuchen, die '@ Seite' aus der partiellen Derp.cshtml ** zu entfernen. – AaronLS

+0

Rasiererseiten-Teiltöne sind hier beschrieben https://www.learnrazorpages.com/razor-pages/partials-pages auslassen @page der Teil würde die Nullrefex lösen – vip32

Antwort

3

Razor’s partial views sind grundsätzlich .cshtml Ansichten, die in eine andere Ansicht, das heißt eine Rasierklingenansicht oder eine Rasierklingenseite sind. Sie werden innerhalb dieser Ansicht gerendert und als solche erben einige der Eigenschaften der Ansicht, z. sein ViewData. Sie haben jedoch keinen Controller, ein Seitenmodell oder irgendeine andere Art von "Code hinter", der Ihnen eine Möglichkeit gibt, Code für den Partiellen Code auszuführen.

Daher ist die primäre Verwendung für Partialtypen, allgemeine Komponenten, die keine Logik enthalten, in separate und wiederverwendbare Dateien zu extrahieren.

Die andere Art von wiederverwendbaren Komponenten, die in Razor vorhanden sind, sind view components. View-Komponenten ähneln Partials, verfügen jedoch über eine tatsächliche Klasse, die sie unterstützt, und mit der Sie der View-Komponente Ihre eigene Logik hinzufügen können.

Im Moment folgen Ansicht, die Komponenten der MVC-Layout für Ansichten, die Komponentensicht bedeutet eigentlich eine Klasse ist, und Sie geben einen Blick von seiner Invoke Methode, die die Ansicht Engine, die .cshtml im Views Ordner suchen verursacht. David Fowler hat mir jedoch bestätigt, dass sie an einer Razor-Seite arbeiten, die auch für View-Komponenten geeignet ist. In einer späteren Version von ASP.NET Core können Sie schließlich eine View-Komponente .cshtml schreiben und Code-Behind hinzufügen dazu (genau wie Razor-Seiten).

Zurück zu Ihrer Frage, im Moment gibt es zwei Arten von Einstiegspunkten für eine MVC-Route: Ein MVC-Controller, der möglicherweise eine Ansicht zurückgibt, und eine Razor-Seite. Keines von beiden kann jedoch das eine oder das andere innerhalb von ihnen aufrufen. Wenn Sie eine Ansicht rendern, können Sie Teilansichten laden oder Komponenten anzeigen, aber keine anderen "vollen" Ansichten oder Razor-Seiten. Und wenn Sie eine Razor-Seite neu erstellen, können Sie auch Teilansichten laden oder Komponenten anzeigen, aber immer noch keine anderen "vollen" Ansichten oder Razor-Seiten.

Also was Sie wollen, ist einfach nicht möglich, weil eine Razor-Seite ein Einstiegspunkt zur Route sein soll, und während Sie irgendeine Ansicht aufrufen, wie eine partielle funktionieren kann (in einigen Situationen), werden Sie sicherlich nicht bekommen der Controller für diese Ansicht und das Seitenmodell, das dafür ausgeführt wird. Wenn Sie etwas mit komplexer Logik aufrufen möchten, sollten Sie stattdessen Ansichtskomponenten verwenden.

+0

danke für die detaillierte Antwort! Ich muss definitiv mehr über ViewComponents lesen, das sind wahrscheinlich die, nach denen ich suche. Es schien nur komisch, dass in meinem Projekt teilweise Ansichten und Seiten gemischt waren. Und +1 dafür, dass du mit einem Microsoft-Entwickler in einer Sackgasse steckst! – Rabadash8820

Verwandte Themen