{"id":55000130,"date":"2018-04-01T00:00:00","date_gmt":"2020-03-27T19:31:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=130"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Razor_Pages_Von_Seite_zu_Seite","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Razor_Pages_Von_Seite_zu_Seite\/","title":{"rendered":"Razor Pages: Von Seite zu Seite"},"content":{"rendered":"<p><b>Wenn Sie eine Webanwendung zur Verwaltung von Daten programmieren, wollen Sie Daten anzeigen, eingeben, l&ouml;schen und so weiter. Das gelingt nicht ohne Navigation zwischen den verschiedenen Seiten. Die Hauptseiten sind &uuml;ber die Navigationsleisten erreichbar, aber wenn Sie etwa einen bestimmten Datensatz anzeigen, Daten von einer Seite zur n&auml;chsten &uuml;bermitteln oder nach dem L&ouml;schen eines Datensatzes wieder die &Uuml;bersicht einblenden wollen, ben&ouml;tigen Sie entsprechende Techniken. Dieser Artikel zeigt, wie Sie mit Links, Senden von Formularen und anderen Methoden von Seite zu Seite gelangen und die gew&uuml;nschten Daten &uuml;bermitteln. Dabei spielen auch die Ereignis-Handler einer Seite eine Rolle.<\/b><\/p>\n<h2>Einfache Links<\/h2>\n<p>Einen einfachen Link erstellen Sie in herk&ouml;mmlichen HTML-Seiten mit dem <b>a<\/b>-Element. In Razor Pages verwenden Sie ein anderes Attribut, um die Zielseite anzugeben &#8211; n&auml;mlich <b>asp-page<\/b>. Wenn Sie etwa von der <b>Index.cshtml<\/b>-Seite im Verzeichnis <b>Pages <\/b>des Projekts auf die <b>About<\/b>-Seite verlinken wollen, k&ouml;nnen Sie das etwa mit dem folgenden Code erledigen:<\/p>\n<pre>@page\r\n@model IndexModel\r\n@{\r\n     ViewData[\"Title\"] = \"Home page\";\r\n}\r\n&lt;h2&gt;Link-Beispiele&lt;\/h2&gt;\r\n&lt;p&gt;&lt;a asp-page=\"About\"&gt;Zur Seite ''About''&lt;\/a&gt;&lt;\/p&gt;<\/pre>\n<p>Das Ergebnis sieht dann etwa wie in Bild 1 aus. Da sich die Seite <b>About.cshtml <\/b>im gleichen Verzeichnis wie die Seite <b>Index.cshtml <\/b>befindet, reicht die Angabe des Namens der Seite ohne die Dateiendung <b>.cshtml<\/b>. Ein Klick auf diesen Link zeigt dann die Seite <b>About.cshtml <\/b>im Browser an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_130_001.png\" alt=\"Einfacher Link\" width=\"549,6265\" height=\"235,5543\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einfacher Link<\/span><\/b><\/p>\n<h2>Handler-Methoden<\/h2>\n<p>Unter ASP.NET Core\/Razor Pages gibt es verschiedene Handler-Methoden. Diese hei&szlig;en beispielsweise wie folgt:<\/p>\n<ul>\n<li><b>OnPost<\/b><\/li>\n<li><b>OnGet<\/b><\/li>\n<li><b>OnPostAsync<\/b><\/li>\n<li><b>OnGetAsync<\/b><\/li>\n<\/ul>\n<p>Die Code behind-Datei einer Razor Page enth&auml;lt normalerweise die folgende Handler-Methode:<\/p>\n<pre>public void OnGet() {\r\n}<\/pre>\n<p>Diese wird gleich beim Laden der Seite auf der Serverseite ausgel&ouml;st. Dies k&ouml;nnen wir pr&uuml;fen, indem wir der Methode einen Haltepunkt hinzuf&uuml;gen und das Projekt starten. Bevor die Seite im Browser erscheint, h&auml;lt die Methode an der Stelle mit dem Haltepunkt an. Auch wenn Sie die Seite mit der Taste <b>F5 <\/b>aktualisieren, wird die Methode wieder ausgel&ouml;st.<\/p>\n<p>In der durch unsere Seite <b>Index.cshtml <\/b>verlinkten Seite <b>About.cshtml <\/b>haben wir die gleiche Prozedur angelegt und mit einem Haltepunkt versehen. Klicken wir zur Laufzeit auf den Link, l&ouml;st dies die Methode <b>OnGet <\/b>dieser Seite aus.<\/p>\n<h2>Methode OnPost ausl&ouml;sen<\/h2>\n<p>Nun wollen wir eine zweite Handler-Methode namens <b>OnPost <\/b>hinzuf&uuml;gen, die genau gleich aufgebaut ist wie <b>OnGet<\/b>. Auch diese f&uuml;gen wir wieder beiden Pages hinzu, also <b>Index.cshtml <\/b>und <b>About.cshtml<\/b>:<\/p>\n<pre>public void OnPost() {\r\n}<\/pre>\n<p>Um diese zu testen, ben&ouml;tigen wir auf der Seite <b>Index.cshtml <\/b>ein Formular. Dieses erh&auml;lt die Methode <b>post <\/b>f&uuml;r das Attribut <b>method<\/b> und eine Schaltfl&auml;che zum Absenden des Formulars:<\/p>\n<pre>&lt;form method=\"post\"&gt;\r\n     &lt;button class=\"btn btn-default\"&gt;Zur gleichen Seite.&lt;\/button&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Wenn wir nun auf diese Schaltfl&auml;che klicken, wird die Methode <b>OnPost <\/b>der aufgerufenen Seite <b>Index.cshtml <\/b>aufgerufen &#8211; diese wird dann auch erneut angezeigt.<\/p>\n<p>Nun f&uuml;gen wir eine weitere Schaltfl&auml;che in einem neuen Formular hinzu, welche die Seite <b>About.cshtml <\/b>aufrufen soll. Standardm&auml;&szlig;ig wird beim Absenden eines Formulars immer die Seite aufgerufen, auf der sich das Formular befindet. Um eine andere Seite wie etwa <b>About.cshtml <\/b>aufzurufen, f&uuml;gen Sie dem <b>button<\/b>-Element das Attribut <b>asp-page <\/b>mit dem Namen der aufzurufenden Datei hinzu:<\/p>\n<pre>&lt;form method=\"post\"&gt;\r\n     &lt;button class=\"btn btn-default\" asp-page=\"About\"&gt;Zur Seite ''About''.&lt;\/button&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Dies &ouml;ffnet die Seite <b>About.cshtml <\/b>und f&uuml;hrt dort die Handler-Methode <b>OnPost <\/b>aus.<\/p>\n<h2>Mehrere Formulare f&uuml;r die gleiche Seite<\/h2>\n<p>Im obigen Fall haben wir nun zwei Formulare, die allerdings verschiedene Seiten aufrufen. Wenn Sie jedoch verschiedene Formulare auf einer Seite nutzen, die alle die gleiche Seite aufrufen &#8211; beispielsweise die aktuelle Seite &#8211; gelingt dies nat&uuml;rlich. Allerdings wird immer die gleiche Handler-Methode aufgerufen, standardm&auml;&szlig;ig <b>OnPost<\/b>. Wenn Sie mehrere Formulare nutzen wollen, die zur Ausf&uuml;hrung verschiedener <b>OnPost<\/b>-Methoden f&uuml;hren sollen, legen Sie etwa die folgenden Formulare an:<\/p>\n<pre>&lt;h3&gt;Zwei Formulare zu verschiedenen OnPost-Methoden&lt;\/h3&gt;\r\n&lt;form method=\"post\" asp-page-handler=\"Eins\"&gt;\r\n     &lt;button class=\"btn btn-default\"&gt;Zur Methode OnPostEins.&lt;\/button&gt;\r\n&lt;\/form&gt;\r\n&lt;form method=\"post\" asp-page-handler=\"Zwei\"&gt;\r\n     &lt;button class=\"btn btn-default\" &gt;Zur Methode OnPostZwei.&lt;\/button&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Die Seite sieht mittlerweile wie in Bild 2 aus. Wenn Sie nun nacheinander auf die beiden Schaltfl&auml;chen <b>Zur Methode OnPostEins <\/b>und <b>Zur Methode OnPostZwei <\/b>anklicken, wird nun beide Male die Methode <b>OnPost <\/b>des Formulars <b>Index.cshtml <\/b>ausgef&uuml;hrt. Es hat sich also erstmal nichts ge&auml;ndert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_130_002.png\" alt=\"Beispiel-Links und -Formulare\" width=\"424,7115\" height=\"283,3399\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Beispiel-Links und -Formulare<\/span><\/b><\/p>\n<p>Um tats&auml;chlich zwei verschiedene Methoden aufzurufen, m&uuml;ssen Sie diese nach einem bestimmten Schema anlegen. Dieses besteht aus dem eigentlichen Namen der Handler-Methode, also <b>OnPost<\/b>, und dem mit <b>asp-page-handler <\/b>angegebenen Ausdruck. Die beiden von den beiden Formularen adressierten Handler-Methoden hei&szlig;en also <b>OnPostEins <\/b>und <b>OnPostZwei <\/b>und sehen wie folgt aus:<\/p>\n<pre>public void OnPostEins() {\r\n}\r\npublic void OnPostZwei() {\r\n}<\/pre>\n<p>Beim Anklicken der beiden Schaltfl&auml;chen werden nun diese beiden Handler-Methoden aufgerufen. Diese Technik k&ouml;nnen Sie also beispielsweise nutzen, wenn Sie die angezeigten Daten einer Datenbank bearbeiten, l&ouml;schen oder anzeigen wollen.<\/p>\n<p>Wie wird der <b>Page<\/b>-Handler nun &uuml;bermittelt Wie Bild 3 zeigt, &uuml;ber die Parameterliste beim Aufruf der Seite.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_130_003.png\" alt=\"Page-Handler als Parameter beim Seitenaufruf\" width=\"449,6946\" height=\"188,8328\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Page-Handler als Parameter beim Seitenaufruf<\/span><\/b><\/p>\n<h2>Ein Formular mit mehreren Schaltfl&auml;chen<\/h2>\n<p>Sie k&ouml;nnen auch zwei verschiedene Aktionen mit zwei Schaltfl&auml;chen in einem <b>form<\/b>-Element unterbringen. Dazu m&uuml;ssen Sie lediglich das Attribut <b>asp-page-handler <\/b>vom <b>form<\/b>-Element in die <b>button<\/b>-Elemente &uuml;bertragen.<\/p>\n<p>Folgendes Beispiel funktioniert genauso wie das vorherige:<\/p>\n<pre>&lt;h3&gt;Zwei Schaltfl&auml;chen eines Formulars zu verschiedenen OnPost-Methoden&lt;\/h3&gt;\r\n&lt;form method=\"post\"&gt;\r\n     &lt;button class=\"btn btn-default\" asp-page-handler=\"Eins\"&gt;Zur Methode OnPostEins.&lt;\/button&gt;\r\n     &lt;button class=\"btn btn-default\" asp-page-handler=\"Zwei\"&gt;Zur Methode OnPostZwei.&lt;\/button&gt;\r\n&lt;\/form&gt;<\/pre>\n<h2>Formulare mit Get<\/h2>\n<p>Wir sehen also, dass bei Formularen mit der Post-Methode die Parameter &#8211; wie hier zum Beispiel der Wert des <b>Page<\/b>-Handlers &#8211; per Parameter an die URL angeh&auml;ngt werden. In manchen F&auml;llen macht es Sinn, einen alternativen Ansatz zu w&auml;hlen, n&auml;mlich die <b>Get<\/b>-Methode. Der einzige Unterschied zur <b>Post<\/b>-Methode im HTML-Code ist, dass Sie statt dem Wert <b>post <\/b>den Wert <b>get <\/b>f&uuml;r das Attribut <b>method <\/b>des Formulars festlegen. Dazu legen wir zwei weitere Formulare an:<\/p>\n<pre>&lt;h3&gt;Zwei Formulare zu verschiedenen OnGet-Methoden&lt;\/h3&gt;\r\n&lt;form method=\"get\" asp-page-handler=\"Eins\"&gt;\r\n     &lt;button class=\"btn btn-default\"&gt;Zur Methode OnGetEins.&lt;\/button&gt;\r\n&lt;\/form&gt;\r\n&lt;form method=\"get\" asp-page-handler=\"Zwei\"&gt;\r\n     &lt;button class=\"btn btn-default\"&gt;Zur Methode OnGetZwei.&lt;\/button&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Starten Sie nun die Anwendung und klicken diese beiden Schaltfl&auml;chen an, l&ouml;sen Sie jeweils die Methode <b>OnGet <\/b>der Code behind-Klasse der Seite <b>Index.cshtml <\/b>aus. Allerdings sehen wir auch, dass der Page-Handler hier nicht als Parameter &uuml;bergeben wird (siehe Bild 4). Legen wir also nun die beiden passenden Handler-Methoden namens <b>OnGetEins <\/b>und <b>OnGetZwei <\/b>an:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_130_003.png\" alt=\"Kein Parameter mit Page-Handler bei der Get-Methode\" width=\"449,6946\" height=\"188,8328\" \/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000130\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000130?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000130\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9fac6dd15a\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Webanwendung zur Verwaltung von Daten programmieren, wollen Sie Daten anzeigen, eingeben, l&ouml;schen und so weiter. Das gelingt nicht ohne Navigation zwischen den verschiedenen Seiten. Die Hauptseiten sind &uuml;ber die Navigationsleisten erreichbar, aber wenn Sie etwa einen bestimmten Datensatz anzeigen, Daten von einer Seite zur n&auml;chsten &uuml;bermitteln oder nach dem L&ouml;schen eines Datensatzes wieder die &Uuml;bersicht einblenden wollen, ben&ouml;tigen Sie entsprechende Techniken. Dieser Artikel zeigt, wie Sie mit Links, Senden von Formularen und anderen Methoden von Seite zu Seite gelangen und die gew&uuml;nschten Daten &uuml;bermitteln. Dabei spielen auch die Ereignis-Handler einer Seite eine Rolle.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022018,662018,44000018,44000027,44000017],"tags":[],"yst_prominent_words":[],"class_list":["post-55000130","post","type-post","status-publish","format-standard","hentry","category-66022018","category-662018","category-ASPNET_Core","category-Excel_programmieren","category-WebApps_Razor_Pages"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000130"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000130\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000130"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}