Razor Querystring, Urlsegment

Ich habe keine einzige Website mit ASP.NET MVC in Betrieb genommen. Erstens hat Webforms das getan was ich brauche und zweitens hat mich der Aufwand mit dem Controller abgeschreckt. Häufig erstelle (oder helfe dabei) ich ganz simple Dinge wie ein Formular, das ein Email versendet. Mit den Webforms Pages kann man das mit Notepad tun ohne einen Compiler zu bemühen. ASP.NET Core und seine Razor View Engine braucht a) keine Controller und man kann b) in der Tat mit Notepad seine Website runtertippen. Ganz ohne Visual Studio, Compiler oder gar Unit Test. .net Einfach eine Datei mit der Endung cshtml erzeugen. VB.NET wird leider von .net core 2.2 noch nicht unterstützt. 

 

Der Webforms Entwickler wird das einfache Objekt Model von Steuerelementen missen, musste aber schon dort öfter mal auf das Request Objekt ausweichen. So lassen sich HTML Input Felder auslesen oder eben auch ein Querystring. Auch das Response Objekt ist vorhanden und stellt eine Redirect Methode bereit um den Client Browser zu veranlassen eine andere Seite aufzurufen.

Im folgenden C# Code Schnippsel einer cshtml Datei, erkennt man, das die Page als Objekt gehandhabt wird. Ganz ohne Codebehind, wenn man möchte. Im  @{ Code Block wird die Logik untergebracht, die immer durchlaufen wird, im Sinne eines Page_Load. Im functions Block (Zeile 8) finden sich Properties und Methoden dieses Page Objekts. Je nach HTTP Kommando landet die Ausführung in OnPost oder OnGet.

 

   1:  @page 
   2:  @{
   3:      Layout = null;
   4:      int id1;
   5:      int.TryParse(HttpContext.Request.Query["id"], out id1); //?id=23  
   6:      
   7:  }
   8:  @functions
   9:  {
  10:      public int id2 { get; set; }
  11:      public void OnGet()
  12:      {
  13:          id2 = id;
  14:   
  15:      }
  16:      public void OnPost()
  17:      {
  18:          Response.Redirect("test");
  19:      }
  20:  }

Das folgende HTML Code Beispiel zeigt wie man die Werte im HTML ausgeben kann. Beides befindet sich in diesem Beispiel in der gleichen Datei. Auch hier wird ein Codesegment mit dem @ Zeichen eingeleitet (statt <% %>). Darauf kann eine Funktion wie for each folgen oder eben Variablen.

 

   1:      @id1
   2:      <br>
   3:      @id2
   4:      <br>
   5:      @Model.id2
   6:      <br>
   7:     
   8:      
   9:      <form method="post">
  10:          <input name="id9" />
  11:          <button type="submit">post</button>
  12:      </form>

Weitgehend durchgesetzt hat sich, das die Url mit Querystring oder Urlsegmenten (gerne als Routing bezeichnet) den Status verwalten. Hat der Benutzer eine Liste von Dingen und klickt er einen Eintrag um ihn zu editieren, landet er im Browser auf einer Seite Edit?id=123.

Der sozusagen empfohlene Weg in Razor sieht anders aus. Die Route wird im @Page Element deklariert. Entweder ala FriendlyUrlsegment (Webforms) oder der gute alte Querystring (mit Typ) oder beides kombiniert. Ist der Parameter optional wird ala nullable ein Fragezeichen hin angestellt.

@page "{id:int?}"

@page "{id}/{query?}"

In den Parametern der Page Method ist dann ein oder mehr übergebene Werte aus der Url enthalten und kann genutzt werden. Hier den Wert des Property id2 zuweisen.

   1:  public void OnGet(int id)
   2:      {
   3:          id2 = id;


Im obigen HTML Code wird auf ein Feld definiert in Zeile 4 ( Block 1)  verwiesen. Für das Property id2  gilt das gleiche. Zusätzlich enthält das Page Model (Zeile 5) nun auch die Variable id2. Die Variable id aus der Page Direktive kann nicht direkt gebunden werden.


In späteren Versionen wurde ASP.NET Webforms Modelbinding hinzugefügt. Damit lassen sich Datenobjekte und UI Element verbinden ohne das man explizit um das lesen und schreiben kümmern muss. Etwas was man als MVVM oder MVC kennt. Der sichtbare große Vorteil ist, das nach einem Post die Input Felder noch immer mit den ursprünglichen Werten gefüllt sind. Microsoft spendiert der Razor View Engine die Modelbinding Funktion mit Hilfe der Taghelper. Taghelper sind optisch HTML Erweiterung, die in HTML Hilfsklassen erledigt werden.

Fügen Sie vor dem Codeblock (@{) folgenden Zeile ein

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Das Property id2 wird über ein Attribut in das Binding Model eingebunden. Die OnPost Methode benötigt keinen Parameter mehr. Den Inhalt der Benutzereingabe findet man direkt ohne Zwischenschritt im Model.

   1:  [BindProperty]
   2:  public int id2 { get; set; }
   3:  ....
   4:  public void OnPost()
   5:  {
   6:     var x = Model.id2;
   7:  ....

Um die Bindung in der HMTL View dem entpsrechenden Input zuzuweisen, muss das Tag Helper Attribut asp-for genutzt werden. Wenn die Deklaration per @addTaghelper fehlt oder fehlerhaft ist, wird Visual Studio das Attribut nicht lilafarbig darstellen.

image

 

So einfach kann modernes programmieren sein. Mehr dazu lernt man in der Schulung ASP.NET Core und Web Api.

Kommentare sind geschlossen