{"id":55000132,"date":"2018-04-01T00:00:00","date_gmt":"2020-03-27T19:32:07","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=132"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Razor_Pages_mit_Datenbankanbindung","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Razor_Pages_mit_Datenbankanbindung\/","title":{"rendered":"Razor Pages mit Datenbankanbindung"},"content":{"rendered":"<p><b>Nachdem Sie in weiteren Artikeln einige Grundlagen zur Programmierung von Razor Pages mit ASP.NET Core kennengelernt haben, geht es nun einen Schritt weiter: Wir wollen eine erste kleine Anwendung f&uuml;r den Zugriff auf die Daten einer Datenbank programmieren. Dazu beginnen wir mit einer kleinen Tabelle, f&uuml;r die wir eine &Uuml;bersicht und eine Detailseite zum Ansehen und Bearbeiten der einzelnen Felder erstellen. Die &Uuml;bersicht soll nat&uuml;rlich auch eine M&ouml;glichkeit zum Hinzuf&uuml;gen und L&ouml;schen der Datens&auml;tze bieten.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>Sie ben&ouml;tigen Visual Studio in der Version von 2017, die Sie mit den Komponenten wie im Artikel Visual Studio 2017 Community Edition beschrieben installieren.<\/p>\n<h2>Projekt erstellen<\/h2>\n<p>Wir erstellen ein Projekt auf Basis der Vorlage <b>Visual C#|Web|ASP.NET Core Webanwendung <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_001.png\" alt=\"Projekt anlegen\" width=\"549,6265\" height=\"309,7769\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Projekt anlegen<\/span><\/b><\/p>\n<p>Im folgenden Dialog w&auml;hlen Sie den Eintrag <b>Webanwendung <\/b>aus, da wir hier schon einige Elemente bekommen, die wir sonst manuell nachreichen m&uuml;ssten (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_002.png\" alt=\"Projektvorlage definieren\" width=\"549,6265\" height=\"386,6967\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Projektvorlage definieren<\/span><\/b><\/p>\n<h2>Anpassen des Rahmens<\/h2>\n<p>Mit Rahmen meinen wir die Seite, welche die Navigationsleiste und den Fu&szlig;bereich der Seite definiert. In unserem automatisch erstellten Demo-Projekt ist dies die Seite <b>_Layout.cshtml<\/b>. Wie die enthaltenen Elemente einer Webanwendung anpassen k&ouml;nnen, erfahren Sie beispielsweise im Artikel <b>ASP.NET Core-Anwendung anpassen<\/b>. In unserem Fall wollen wir die Bezeichnung unseres Projekts, das an verschiedenen Stellen in der Datei <b>_Layout.cshtml <\/b>gelandet ist, durch die Bezeichnung unserer Anwendung ersetzen &#8211; also beispielsweise <b>Kundenverwaltung<\/b>. Au&szlig;erdem wollen wir das Navigationsmen&uuml; so &auml;ndern, dass es hinter den Eintr&auml;gen <b>Home <\/b>und <b>About <\/b>den Eintrag <b>Kunden <\/b>anzeigt.<\/p>\n<p>Damit dies geschieht, &auml;ndern wir in Bild 3 markierten Zeilen in der Datei <b>_Layout.cshtml<\/b>. Die eingerahmten Stellen markieren die zu &auml;ndernden Stellen, der Pfeil zeigt den Befehl <b>@RenderBody()<\/b>, an dem sp&auml;ter die eigentlichen Inhalte eingef&uuml;gt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_003.png\" alt=\"Datei _Layout.cshtml anpassen\" width=\"649,559\" height=\"728,34\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Datei _Layout.cshtml anpassen<\/span><\/b><\/p>\n<p>Den Inhalt der Index-Seite, also der Seite, die direkt beim Starten der Anwendung im Browser angezeigt wird, k&ouml;nnen Sie auch anpassen. Den ersten <b>div<\/b>-Teil mit <b>id=&#8221;myCarousel&#8221; <\/b>entfernen wir komplett. Im folgenden <b>div<\/b>-Element entfernen wir die hinteren Auflistungen. Den vorderen Teil k&ouml;nnen wir wie folgt anpassen. Dabei wollen wir eine kleine &Uuml;bersicht &uuml;ber die enthaltenen Funktionen bieten. Der Code sieht anschlie&szlig;end wie folgt aus:<\/p>\n<pre>@page\r\n@model IndexModel\r\n@{\r\n     ViewData[\"Title\"] = \"Home page\";\r\n}\r\n&lt;div class=\"row\"&gt;\r\n     &lt;div class=\"col-md-3\"&gt;\r\n         &lt;h2&gt;Die Beispielanwendung Kundenverwaltung&lt;\/h2&gt;\r\n         &lt;p&gt;Diese Beispielanwendung zeigt, wie Sie eine Demo-Anwendung um Datenbankfunktionen erweitern. Dazu geh&ouml;ren:&lt;\/p&gt;\r\n         &lt;ul&gt;\r\n             &lt;li&gt;&Uuml;bersichten f&uuml;r Kunden und andere Entit&auml;ten mit Schaltfl&auml;chen zum Anzeigen oder L&ouml;schen von Kunden&lt;\/li&gt;\r\n             &lt;li&gt;Anzeige der Kundendetails zum Bearbeiten der Daten&lt;\/li&gt;\r\n             &lt;li&gt;Anzeige der Kundendetails zum Anlegen neuer Kundendatens&auml;tze&lt;\/li&gt;\r\n         &lt;\/ul&gt;\r\n     &lt;\/div&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>Wenn Sie die Anwendung danach starten, zeigt der Browser die Seite aus Bild 4 an. F&uuml;r die wenigen &Auml;nderungen, die wir vorgenommen haben, sieht diese schon recht ordentlich aus. Ein Klick auf den Link Kunden in der Navigationsleiste zeigt nun leider noch keine Kundenseite an, was wir als N&auml;chstes in Angriff nehmen werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_004.png\" alt=\"Die angepasste Startseite\" width=\"649,559\" height=\"332,6404\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die angepasste Startseite<\/span><\/b><\/p>\n<h2>Kunden-Klasse hinzuf&uuml;gen<\/h2>\n<p>Nun wollen wir uns um die anzuzeigenden Daten k&uuml;mmern. Dazu ben&ouml;tigen wir eine Datenbank und ein entsprechendes Entity Data Model mit den Klassen f&uuml;r die einzelnen Entit&auml;ten. Wir verwenden den Code First-Ansatz, bei dem wir erst die Entit&auml;tsklassen definieren und daraus dann automatisch die Datenbank erstellen lassen. F&uuml;r die Entit&auml;tsklassen legen wir direkt unterhalb des Projektordners ein neues Verzeichnis namens <b>Models <\/b>an.<\/p>\n<p>In diesem Verzeichnis erstellen wir mit dem Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Klasse&#8230; <\/b>eine neue Klassendatei, der wir im folgenden Dialog <b>Neues Element hinzuf&uuml;gen <\/b>den Namen <b>Customer <\/b>geben. Wir k&ouml;nnten auch die deutsche Bezeichnung verwenden, aber beim Entity Framework ist es einfacher, wenn man die Bezeichnungen in englischer Sprache angibt. So kann man leichter Singular durch einfaches Anh&auml;ngen des Buchstaben <b>s <\/b>in Plural verwandeln. Au&szlig;erdem muss man dort nicht aufpassen, ob eine Bezeichnung gleichzeitig Singular und Plural ist (im Deutschen beispielsweise <b>Artikel<\/b>!).<\/p>\n<p>Die Klasse sieht wie folgt aus und wird in der Klassendatei <b>Customer.cs <\/b>angelegt:<\/p>\n<pre>namespace ASPNETCoreEF.Models {\r\n     public class Customer {\r\n         public int ID { get; set; }\r\n         public string FirstName { get; set; }\r\n         public string LastName { get; set; }\r\n         public string Street { get; set; }\r\n         public string Zip { get; set; }\r\n         public string City { get; set; }\r\n     }\r\n}<\/pre>\n<p>Das Feld <b>ID <\/b>soll der Prim&auml;rsch&uuml;ssel der noch zu erstellenden Tabelle sein, in der die Daten zu den Kunden gespeichert werden.  Die &uuml;brigen Felder ben&ouml;tigen keine weitere Erl&auml;uterung. Fremdschl&uuml;sselfelder und weitere Tabellen lassen wir aus Gr&uuml;nden der &Uuml;bersicht zun&auml;chst au&szlig;en vor.<\/p>\n<p>Beachten Sie, dass durch das Anlegen der Klassendatei im Verzeichnis <b>Models <\/b>auch der Namespace auf <b>ASPNETCoreEF.Models <\/b>eingestellt wurde (<b>ASPNETCoreEF <\/b>ist der Name des Projekts und somit auch als Namespace des Projekts voreingestellt).<\/p>\n<h2>Datenbankkontext erstellen<\/h2>\n<p>Nun ben&ouml;tigen wir noch die Klasse, welche die Informationen der einzelnen Entit&auml;tsklassen &#8211; hier nur eine &#8211; zusammenfasst und Informationen zum Erstellen des Datenmodells speichert. Dazu f&uuml;gen wir dem Projekt zun&auml;chst einen weiteren neuen Ordner namens <b>Data <\/b>hinzu. Hier legen wir eine neue Klasse namens <b>CustomerManagementContext <\/b>an. Dieser f&uuml;gen wir im Kopf der Klassendatei zun&auml;chst einen Verweis auf den Namespace <b>Microsoft.EntityFrameworkCore <\/b>hinzu:<\/p>\n<pre>using Microsoft.EntityFrameworkCore;<\/pre>\n<p>Da die <b>Customer<\/b>-Klasse sich im Verzeichnis <b>Models <\/b>und somit auch im Namespace <b>ASPNETCoreEF.Models <\/b>befindet, f&uuml;gen wir auch diesen Namespace noch hinzu:<\/p>\n<pre>using ASPNETCoreEF.Models;<\/pre>\n<p>Die Klasse soll die Schnittstelle <b>DbContext <\/b>implementieren. Au&szlig;erdem erh&auml;lt Sie ein <b>DbSet<\/b>-Objekt namens <b>Customers<\/b>, welches Elemente des Typs <b>Customer <\/b>aufnehmen soll:<\/p>\n<pre>public class CustomerManagementContext : DbContext {\r\n     public CustomerManagementContext(DbContextOptions&lt;CustomerManagementContext&gt; options) : base(options) {\r\n     }\r\n     public DbSet&lt;Customer&gt; Customers { get; set; }\r\n}<\/pre>\n<p>Wir &uuml;berschreiben noch die Methode <b>OnModelCreating <\/b>und geben dort an, dass die Tabelle f&uuml;r die Kunden nicht <b>Customer <\/b>hei&szlig;en soll, sondern im Plural <b>Customers <\/b>angelegt werden soll:<\/p>\n<pre>protected override void OnModelCreating(ModelBuilder modelBuilder) {\r\n     modelBuilder.Entity&lt;Customer&gt;().ToTable(\"Customers\");\r\n}<\/pre>\n<h2>DbContext beim Anwendungsstart registrieren<\/h2>\n<p>Damit die Datenbank &uuml;ber das <b>DbContext<\/b>-Objekt gleich nach dem Start zur Verf&uuml;gung steht, f&uuml;gen wir der Methode <b>ConfigureServices <\/b>der Datei noch eine entsprechende Anweisung hinzu. Die Datei <b>Startup.cs <\/b>erh&auml;lt jedoch zuvor zwei zus&auml;tzliche Verweise auf die ben&ouml;tigten Namespaces:<\/p>\n<pre>using Microsoft.EntityFrameworkCore;\r\nusing ASPNETCoreEF.Data;<\/pre>\n<p>Dann erg&auml;nzen wir <b>ConfigureServices <\/b>wie folgt:<\/p>\n<pre>public void ConfigureServices(IServiceCollection services) {\r\n     services.AddMvc();\r\n     services.AddDbContext&lt;CustomerManagementContext&gt;(options =&gt; \r\n         options.UseSqlServer(Configuration.GetConnectionString(\"DefaultConnection\")));\r\n}<\/pre>\n<p>Dadurch greift das Projekt auf die Verbindungszeichenfolge zu, die wir noch in der Datei <b>appsettings.json <\/b>speichern m&uuml;ssen. Diese erweitern wir wie folgt:<\/p>\n<pre>{\r\n   \"ConnectionStrings\": {\r\n     \"DefaultConnection\": \"Server=(localdb)<\/font>mssqllocaldb;Database=CustomerManagement;ConnectRetryCount=0;        Trusted_Connection=True;MultipleActiveResultSets=true\"\r\n   },\r\n   \"Logging\": {\r\n     \"IncludeScopes\": false,\r\n     \"LogLevel\": {\r\n       \"Default\": \"Warning\"\r\n     }\r\n   }\r\n}<\/pre>\n<p>Hier legen wir in der Einstellung <b>ConnectionStrings <\/b>fest, dass die Standardverbindungszeichenfolge den Server <b>localdb <\/b>verwenden soll und der Datenbankname <b>CustomerManagement <\/b>lautet. Au&szlig;erdem soll Windows-Authentifizierung f&uuml;r den Zugriff auf die Datenbank verwendet werden (<b>Trusted_Connection=True<\/b>).<\/p>\n<h2>Ein paar Daten vorbereiten<\/h2>\n<p>Nun wollen wir noch daf&uuml;r sorgen, dass die Tabelle <b>Customers<\/b> beim Start der Anwendung nicht v&ouml;llig leer ist. Daher f&uuml;gen wir der Anwendung im Verzeichnis <b>Data <\/b>eine neue Klassendatei namens <b>DbInitializer.cs <\/b>hinzu. Diese f&uuml;llen wir wie folgt:<\/p>\n<pre>public class DbInitializer {\r\n     public static void Initialize(CustomerManagementContext dbContext) {\r\n         dbContext.Database.EnsureCreated();\r\n         if (dbContext.Customers.Any()) {\r\n             return;\r\n         }\r\n         var customers = new Customer[] {\r\n             new Customer{FirstName=\"Andr&eacute;\", LastName=\"Minhorst\", Street=\"Borkhofer Str. 17\", Zip=\"47137\", City=\"Duisburg\"},\r\n             new Customer{ FirstName=\"Klaus\", LastName=\"M&uuml;ller\", Street=\"Teststr. 1\", Zip=\"12345\", City=\"Berlin\" },\r\n             new Customer{ FirstName=\"Herbert\", LastName=\"Meier\", Street=\"Beispielweg 2\", Zip=\"23456\", City=\"Bremen\"}\r\n         };\r\n         foreach (Customer c in customers) {\r\n             dbContext.Customers.Add(c);\r\n         }\r\n         dbContext.SaveChanges();\r\n     }\r\n}<\/pre>\n<p>Die Klasse enth&auml;lt eine Methode namens <b>Initialize<\/b>, welche mit dem Parameter <b>dbContext <\/b>ein Objekt des Typs <b>CustomerManagementContext <\/b>entgegennimmt. Sie pr&uuml;ft zun&auml;chst ob die Datenbank bereits erstellt wurde und erledigt dies gegebenenfalls im gleichen Schritt mit der Methode <b>EnsureCreated<\/b>. Dann pr&uuml;ft sie, ob die <b>Customers<\/b>-Tabelle bereits Daten enth&auml;lt. Falls ja, bricht sie an dieser Stelle ab. Anderenfalls erstellt sie ein Array mit drei Elementen des Typs <b>Customer<\/b>. Die folgende <b>foreach<\/b>-Schleife durchl&auml;uft dieses Array und f&uuml;gt die einzelnen Elemente des Typs <b>Customer <\/b>zum <b>DbSet <\/b>namens <b>Customers <\/b>des <b>dbContext <\/b>hinzu. Die &Auml;nderungen werden schlie&szlig;lich mit der <b>SaveChanges<\/b>-Methode gespeichert.<\/p>\n<p>Nun m&uuml;ssen wir noch daf&uuml;r sorgen, dass diese Methode zum Erstellen beziehungsweise F&uuml;llen der Datenbank auch ausgef&uuml;hrt wird. Dazu &auml;ndern wir in der Klassendatei <b>Program.cs <\/b>die Methode <b>Main <\/b>wie folgt:<\/p>\n<pre>public static void Main(string[] args) {\r\n     \/\/            BuildWebHost(args).Run();\r\n     var host = BuildWebHost(args);\r\n     using (var scope = host.Services.CreateScope()) {\r\n         var services = scope.ServiceProvider;\r\n         var dbContext = services.GetRequiredService&lt;CustomerManagementContext&gt;();\r\n         DbInitializer.Initialize(dbContext);\r\n     }\r\n     host.Run();\r\n}<\/pre>\n<p>Dabei kommentieren wir die dort bereits vorhandene Anweisung aus. Diese ein neues Webhost-Objekt und f&uuml;hrte direkt seine <b>Run<\/b>-Methode aus. Hier wollen wir das Erstellen der Datenbank zwischenschalten. Dazu teilen wir die Anweisung auf, sodass diese zun&auml;chst das neue Objekt mit <b>BuildWebHost <\/b>erstellt und in der neuen Variable namens <b>host <\/b>speichert. Die <b>Run<\/b>-Methode f&uuml;r die Variable <b>host <\/b>wird dann als letzte Anweisung ausgef&uuml;hrt. Dazwischen f&uuml;gen wir ein paar neue Anweisungen ein. Die erste erstellt ein neues <b>Scope<\/b>-Element und speichert es in der Variablen <b>scope<\/b>. &Uuml;ber die Eigenschaft <b>ServiceProvider <\/b>holt die Prozedur dann ein <b>Service<\/b>-Objekt und speichert es in der Variablen <b>services<\/b>. Diees stellt dann &uuml;ber die Methode <b>GetRequiredService <\/b>mit dem Typ <b>CustomerManagementContext <\/b>den Datenbankkontext zur Verf&uuml;gung und speichert diesen in der Variablen <b>dbContext<\/b>. Dieses Objekt &uuml;bergeben wir dann der Methode <b>Initialize <\/b>der zuvor programmierten Klasse <b>DbInitializer<\/b>.<\/p>\n<p>Damit alle als fehlerhaft markierten Stellen verschwinden, m&uuml;ssen Sie wieder die folgenden Namespaces referenzieren:<\/p>\n<pre>using Microsoft.Extensions.DependencyInjection;\r\nusing ASPNETCoreEF.Data;<\/pre>\n<h2>Datenbank erstellen<\/h2>\n<p>Damit ist es soweit: Sie k&ouml;nnen die Anwendung nun starten und damit die Datenbank erstellen. Sobald der Browser aufgerufen wurde und die Startseite der Anwendung anzeigt, k&ouml;nnen Sie diese wieder beenden. Wir blenden dann den <b>SQL Server-Objekt-Explorer <\/b>ein (Men&uuml;eintrag <b>Ansicht|SQL Server-Objekt-Explorer<\/b>) und klappen die Eintr&auml;ge wie in Bild 5 auf. Wenn die Datenbank <b>CustomerManagement <\/b>dort angezeigt wird, navigieren Sie weiter zur Tabelle <b>dbo.Customers <\/b>und w&auml;hlen den Kontextmen&uuml;-Eintrag <b>Daten anzeigen <\/b>aus. Damit sollten auch die soeben per Code hinzugef&uuml;gten Datens&auml;tze erscheinen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_005.png\" alt=\"Die neue Datenbank mit den frischen angelegten Datens&auml;tzen\" width=\"700\" height=\"210,148\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die neue Datenbank mit den frischen angelegten Datens&auml;tzen<\/span><\/b><\/p>\n<p>Die beiden Datenbankdateien <b>CustomerManagement.mdf <\/b>und <b>CustomerManagement.ldf <\/b>wurden auf dem lokalen Rechner im Verzeichnis <b>C:\\Users\\<Benutzername> <\/b>gespeichert. Dabei wurde automatisch der Name als Datenbankname verwendet, den wir in der Verbindungszeichenfolge angegeben haben. Der Tabellenname entspricht wie von uns gew&uuml;nscht der Plural-Form der verwendeten Klasse <b>Customer<\/b>, also <b>Customers<\/b>. Die Eigenschaftsnamen der Klasse <b>Customer <\/b>wurden als Feldnamen verwendet und das Feld mit dem Namen <b>ID <\/b>wurde automatisch als Prim&auml;rschl&uuml;sselfeld festgelegt.<\/p>\n<h2>Kunden&uuml;bersicht hinzuf&uuml;gen<\/h2>\n<p>Da wir neben den Kunden sp&auml;ter noch weitere Daten zur Anwendung hinzuf&uuml;gen werden, legen wir f&uuml;r jede Entit&auml;t einen eigenen Ordner an. Als Erstes ben&ouml;tigen wir also einen Ordner f&uuml;r Kunden, der die &Uuml;bersicht, die Detailseite et cetera aufnehmen soll. Diesen Ordner legen wir unterhalb des Ordners <b>Pages <\/b>an, und zwar &uuml;ber dessen Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Neuer Ordner<\/b>. Der neue Ordner soll analog zur englischen Bezeichnung der Tabelle <b>Customers <\/b>hei&szlig;en.<\/p>\n<p>Diesem Ordner f&uuml;gen wir gleich eine neue Razor-Seite hinzu, die wir <b>Index.cshtml <\/b>nennen. Eine neue Razor-Seite f&uuml;gen Sie dem Ordner hinzu, indem Sie aus seinem Kontextmen&uuml; den Eintrag <b>Hinzuf&uuml;gen|Razor-Seite&#8230; <\/b>ausw&auml;hlen. Im folgenden Dialog finden Sie dann drei M&ouml;glichkeiten (siehe Bild 6):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_006.png\" alt=\"Anlegen einer neuen Razor-Seite\" width=\"700\" height=\"341,5199\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen einer neuen Razor-Seite<\/span><\/b><\/p>\n<ul>\n<li><b>Razor-Seite<\/b><\/li>\n<li><b>Razor-Seite mit Verwendung von Entity Framework<\/b><\/li>\n<li><b>Razor-Seiten mithilfe des Entity Frameworks (CRUD)<\/b><\/li>\n<\/ul>\n<h2>Einfache Razor-Seite anlegen<\/h2>\n<p>W&auml;hlen Sie die erste Option w&auml;hlen, geben Sie im folgenden Schritt einfach den Namen der gew&uuml;nschten Seite an und erstellen diese. Damit erhalten Sie dann eine fast leere Razor-Seite mit zugeh&ouml;riger <b>.cshtml.cs<\/b>-Klassendatei, die Sie weitgehend selbst f&uuml;llen m&uuml;ssen. Diese Option ist interessant, wenn Sie komplett neue Seiten aufbauen m&ouml;chten. Die anderen beiden Optionen h&ouml;ren sich aber wesentlich interessanter an!<\/p>\n<h2>Razor-Seite mit Verwendung von Entity Framework<\/h2>\n<p>Die zweite Option unterscheidet sich vom Titel her von der dritten Option, weil sie offenbar nur eine Seite anlegt und nicht mehrere. Schauen wir uns diese an. Nach der Auswahl erscheint der Dialog aus Bild 7. Hier geben wir zun&auml;chst den Namen der Razor-Seite an. Diese soll Index hei&szlig;en, weil wir zun&auml;chst eine &Uuml;bersicht der Kunden erstellen wollen. Warum nennen wir die Seite dann nicht <b>CustomerOverview <\/b>oder &auml;hnlich Weil die &Uuml;bersicht die Standardseite sein soll, die auch beim Aufrufen des Ordners <b>\/Customer <\/b>bereits erscheint. Wird ein Ordner in der URL angegeben und keine spezielle Datei, ruft die Anwendung die Datei <b>Index.cshtml <\/b>auf, sofern diese in dem Ordner enthalten ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_132_007.png\" alt=\"Auswahl des Inhalts der Seite\" width=\"499,6607\" height=\"316,338\" \/><\/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\/55000132\/\">\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\/55000132?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\/55000132\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\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>Nachdem Sie in weiteren Artikeln einige Grundlagen zur Programmierung  Razor Pages mit ASP.NET Core kennengelernt haben, geht es nun einen Schritt weiter: Wir wollen eine erste kleine Anwendung f&uuml;r den Zugriff auf die Daten einer Datenbank programmieren. Dazu beginnen wir mit einer kleinen Tabelle, f&uuml;r die wir eine &Uuml;bersicht und eine Detailseite zum Ansehen und Bearbeiten der einzelnen Felder erstellen. Die &Uuml;bersicht soll nat&uuml;rlich auch eine M&ouml;glichkeit zum Hinzuf&uuml;gen und L&ouml;schen der Datens&auml;tze bieten.<\/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,44000017,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000132","post","type-post","status-publish","format-standard","hentry","category-66022018","category-662018","category-ASPNET_Core","category-WebApps_Razor_Pages","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000132","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=55000132"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000132\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000132"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}