Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Rick Anderson
In diesem Tutorial erfahren Sie, wie Sie eine ASP.NET Core-Web-API über die Fetch-API mit JavaScript aufrufen.
Voraussetzungen
- Sie haben Tutorial: Erstellen einer Web-API abgeschlossen.
- Sie sind mit CSS, HTML und JavaScript vertraut.
Aufrufen der Web-API mit JavaScript
In diesem Abschnitt fügen Sie eine HTML-Seite hinzu, die Formulare zum Erstellen und Verwalten von To-Do-Elementen enthält. An die Elemente auf der Seite sind Ereignishandler angefügt. Die Ereignishandler führen zu HTTP-Anforderungen an die Aktionsmethoden der Web-API. Die Funktion fetch
der Fetch-API initiiert jede HTTP-Anforderung.
Die Funktion fetch
gibt ein Promise
-Objekt zurück, das eine HTTP-Antwort in Form eines Response
-Objekts enthält. Ein gängiges Muster besteht darin, den JSON-Antworttext durch Aufrufen der json
-Funktion im Response
-Objekt zu extrahieren. JavaScript aktualisiert die Seite mit den Details aus der Antwort der Web-API.
Ein sehr einfacher fetch
-Aufruf akzeptiert einen einzelnen Parameter, der die Route darstellt. Ein zweiter Parameter, der als init
-Objekt bezeichnet wird, ist optional. init
wird zum Konfigurieren der HTTP-Anforderung verwendet.
- Konfigurieren Sie die App so, dass statische Dateien unterstützt werden und die Standarddateizuordnung aktiviert wird. Der folgende hervorgehobene Code ist in
Program.cs
erforderlich:
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
var app = builder.Build();
if (builder.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Erstellen Sie im Stammverzeichnis den Ordner wwwroot.
Erstellen Sie einen css-Ordner im wwwroot-Ordner.
Erstellen Sie einen js- Ordner innerhalb des ordners wwwroot.
Fügen Sie eine HTML-Datei namens
index.html
zum wwwroot-Ordner hinzu. Ersetzen Sie den Inhalt vonindex.html
durch das folgende Markup:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>To-do CRUD</title> <link rel="stylesheet" href="css/site.css" /> </head> <body> <h1>To-do CRUD</h1> <h3>Add</h3> <form action="javascript:void(0);" method="POST" onsubmit="addItem()"> <input type="text" id="add-name" placeholder="New to-do"> <input type="submit" value="Add"> </form> <div id="editForm"> <h3>Edit</h3> <form action="javascript:void(0);" onsubmit="updateItem()"> <input type="hidden" id="edit-id"> <input type="checkbox" id="edit-isComplete"> <input type="text" id="edit-name"> <input type="submit" value="Save"> <a onclick="closeInput()" aria-label="Close">✖</a> </form> </div> <p id="counter"></p> <table> <tr> <th>Is Complete?</th> <th>Name</th> <th></th> <th></th> </tr> <tbody id="todos"></tbody> </table> <script src="js/site.js" asp-append-version="true"></script> <script type="text/javascript"> getItems(); </script> </body> </html>
Fügen Sie eine CSS-Datei namens
site.css
zum Ordner wwwroot/css hinzu. Ersetzen Sie den Inhalt der Dateisite.css
durch die folgenden Formatvorlagen:input[type='submit'], button, [aria-label] { cursor: pointer; } #editForm { display: none; } table { font-family: Arial, sans-serif; border: 1px solid; border-collapse: collapse; } th { background-color: #f8f8f8; padding: 5px; } td { border: 1px solid; padding: 5px; }
Fügen Sie eine JavaScript-Datei namens
site.js
zum Ordner wwwroot/js hinzu. Ersetzen Sie den Inhalt vonsite.js
durch den folgenden Code.const uri = 'api/todoitems'; let todos = []; function getItems() { fetch(uri) .then(response => response.json()) .then(data => _displayItems(data)) .catch(error => console.error('Unable to get items.', error)); } function addItem() { const addNameTextbox = document.getElementById('add-name'); const item = { isComplete: false, name: addNameTextbox.value.trim() }; fetch(uri, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(response => response.json()) .then(() => { getItems(); addNameTextbox.value = ''; }) .catch(error => console.error('Unable to add item.', error)); } function deleteItem(id) { fetch(`${uri}/${id}`, { method: 'DELETE' }) .then(() => getItems()) .catch(error => console.error('Unable to delete item.', error)); } function displayEditForm(id) { const item = todos.find(item => item.id === id); document.getElementById('edit-name').value = item.name; document.getElementById('edit-id').value = item.id; document.getElementById('edit-isComplete').checked = item.isComplete; document.getElementById('editForm').style.display = 'block'; } function updateItem() { const itemId = document.getElementById('edit-id').value; const item = { id: parseInt(itemId, 10), isComplete: document.getElementById('edit-isComplete').checked, name: document.getElementById('edit-name').value.trim() }; fetch(`${uri}/${itemId}`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(() => getItems()) .catch(error => console.error('Unable to update item.', error)); closeInput(); return false; } function closeInput() { document.getElementById('editForm').style.display = 'none'; } function _displayCount(itemCount) { const name = (itemCount === 1) ? 'to-do' : 'to-dos'; document.getElementById('counter').innerText = `${itemCount} ${name}`; } function _displayItems(data) { const tBody = document.getElementById('todos'); tBody.innerHTML = ''; _displayCount(data.length); const button = document.createElement('button'); data.forEach(item => { let isCompleteCheckbox = document.createElement('input'); isCompleteCheckbox.type = 'checkbox'; isCompleteCheckbox.disabled = true; isCompleteCheckbox.checked = item.isComplete; let editButton = button.cloneNode(false); editButton.innerText = 'Edit'; editButton.setAttribute('onclick', `displayEditForm(${item.id})`); let deleteButton = button.cloneNode(false); deleteButton.innerText = 'Delete'; deleteButton.setAttribute('onclick', `deleteItem(${item.id})`); let tr = tBody.insertRow(); let td1 = tr.insertCell(0); td1.appendChild(isCompleteCheckbox); let td2 = tr.insertCell(1); let textNode = document.createTextNode(item.name); td2.appendChild(textNode); let td3 = tr.insertCell(2); td3.appendChild(editButton); let td4 = tr.insertCell(3); td4.appendChild(deleteButton); }); todos = data; }
Möglicherweise ist eine Änderung an den Starteinstellungen des ASP.NET Core-Projekts erforderlich, um die HTML-Seite lokal zu testen:
- Öffnen Sie Properties\launchSettings.json.
- Entfernen Sie die
launchUrl
-Eigenschaft, um zu erzwingen, dass die App mitindex.html
als Startseite geöffnet wird. Dies ist die Standarddatei des Projekts.
Dieses Beispiel ruft alle CRUD-Methoden der Web-API auf. Im Folgenden werden die Web-API-Aufrufe erläutert.
Abrufen einer Liste von To-Do-Elementen
Im folgenden Code wird eine HTTP GET-Anforderung an die Route api/todoitems gesendet:
fetch(uri)
.then(response => response.json())
.then(data => _displayItems(data))
.catch(error => console.error('Unable to get items.', error));
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion _displayItems
aufgerufen. Jedes To-Do-Element im array-Parameter, das von _displayItems
akzeptiert wird, wird der Tabelle mit den Schaltflächen Bearbeiten und Löschen hinzugefügt. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Hinzufügen eines To-Do-Elements
Im folgenden Code wird Folgendes ausgeführt:
- Eine
item
-Variable wird deklariert, um eine Objektliteraldarstellung des To-Do-Elements zu erstellen. - Eine Fetch-Anforderung wird mit den folgenden Optionen konfiguriert:
method
gibt das POST HTTP-Aktionsverb an.body
gibt die JSON-Darstellung des Anforderungstexts an. Die JSON wird erzeugt, indem das initem
gespeicherte Objektliteral an die Funktion JSON.stringify übergeben wird.headers
gibt die HTTP-AnforderungsheaderAccept
undContent-Type
an. Beide Header sind aufapplication/json
festgelegt, um den gesendeten und empfangenen Medientyp anzugeben.
- Eine HTTP POST-Anforderung wird an die Route api/todoitems gesendet.
function addItem() {
const addNameTextbox = document.getElementById('add-name');
const item = {
isComplete: false,
name: addNameTextbox.value.trim()
};
fetch(uri, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(response => response.json())
.then(() => {
getItems();
addNameTextbox.value = '';
})
.catch(error => console.error('Unable to add item.', error));
}
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion getItems
aufgerufen, um die HTML-Tabelle zu aktualisieren. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Aktualisieren eines To-Do-Elements
Das Aktualisieren eines To-Do-Elements funktioniert sehr ähnlich wie das Hinzufügen. Allerdings gibt es zwei wesentliche Unterschiede:
- Die Route erhält den eindeutigen Bezeichner des zu aktualisierenden Elements als Suffix. Beispiel: api/todoitems/1
- Das HTTP-Aktionsverb ist PUT, wie durch die Option
method
angegeben.
fetch(`${uri}/${itemId}`, {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(() => getItems())
.catch(error => console.error('Unable to update item.', error));
Löschen eines To-Do-Elements
Um ein To-Do-Element zu löschen, legen Sie die method
-Option der Anforderung auf DELETE
fest, und geben Sie den eindeutigen Bezeichner des Elements in der URL an.
fetch(`${uri}/${id}`, {
method: 'DELETE'
})
.then(() => getItems())
.catch(error => console.error('Unable to delete item.', error));
Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Web-API-Hilfeseiten generieren:
In diesem Tutorial erfahren Sie, wie Sie eine ASP.NET Core-Web-API über die Fetch-API mit JavaScript aufrufen.
Voraussetzungen
- Sie haben Tutorial: Erstellen einer Web-API abgeschlossen.
- Sie sind mit CSS, HTML und JavaScript vertraut.
Aufrufen der Web-API mit JavaScript
In diesem Abschnitt fügen Sie eine HTML-Seite hinzu, die Formulare zum Erstellen und Verwalten von To-Do-Elementen enthält. An die Elemente auf der Seite sind Ereignishandler angefügt. Die Ereignishandler führen zu HTTP-Anforderungen an die Aktionsmethoden der Web-API. Die Funktion fetch
der Fetch-API initiiert jede HTTP-Anforderung.
Die Funktion fetch
gibt ein Promise
-Objekt zurück, das eine HTTP-Antwort in Form eines Response
-Objekts enthält. Ein gängiges Muster besteht darin, den JSON-Antworttext durch Aufrufen der json
-Funktion im Response
-Objekt zu extrahieren. JavaScript aktualisiert die Seite mit den Details aus der Antwort der Web-API.
Ein sehr einfacher fetch
-Aufruf akzeptiert einen einzelnen Parameter, der die Route darstellt. Ein zweiter Parameter, der als init
-Objekt bezeichnet wird, ist optional. init
wird zum Konfigurieren der HTTP-Anforderung verwendet.
Konfigurieren Sie die App so, dass statische Dateien unterstützt werden und die Standarddateizuordnung aktiviert wird. Der folgende hervorgehobene Code ist in der
Configure
-Methode vonStartup.cs
erforderlich:public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
Erstellen Sie im Stammverzeichnis den Ordner wwwroot.
Erstellen Sie einen css-Ordner im wwwroot-Ordner.
Erstellen Sie einen js- Ordner innerhalb des ordners wwwroot.
Fügen Sie eine HTML-Datei namens
index.html
zum wwwroot-Ordner hinzu. Ersetzen Sie den Inhalt vonindex.html
durch das folgende Markup:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>To-do CRUD</title> <link rel="stylesheet" href="css/site.css" /> </head> <body> <h1>To-do CRUD</h1> <h3>Add</h3> <form action="javascript:void(0);" method="POST" onsubmit="addItem()"> <input type="text" id="add-name" placeholder="New to-do"> <input type="submit" value="Add"> </form> <div id="editForm"> <h3>Edit</h3> <form action="javascript:void(0);" onsubmit="updateItem()"> <input type="hidden" id="edit-id"> <input type="checkbox" id="edit-isComplete"> <input type="text" id="edit-name"> <input type="submit" value="Save"> <a onclick="closeInput()" aria-label="Close">✖</a> </form> </div> <p id="counter"></p> <table> <tr> <th>Is Complete?</th> <th>Name</th> <th></th> <th></th> </tr> <tbody id="todos"></tbody> </table> <script src="js/site.js" asp-append-version="true"></script> <script type="text/javascript"> getItems(); </script> </body> </html>
Fügen Sie eine CSS-Datei namens
site.css
zum Ordner wwwroot/css hinzu. Ersetzen Sie den Inhalt der Dateisite.css
durch die folgenden Formatvorlagen:input[type='submit'], button, [aria-label] { cursor: pointer; } #editForm { display: none; } table { font-family: Arial, sans-serif; border: 1px solid; border-collapse: collapse; } th { background-color: #f8f8f8; padding: 5px; } td { border: 1px solid; padding: 5px; }
Fügen Sie eine JavaScript-Datei namens
site.js
zum Ordner wwwroot/js hinzu. Ersetzen Sie den Inhalt vonsite.js
durch den folgenden Code.const uri = 'api/todoitems'; let todos = []; function getItems() { fetch(uri) .then(response => response.json()) .then(data => _displayItems(data)) .catch(error => console.error('Unable to get items.', error)); } function addItem() { const addNameTextbox = document.getElementById('add-name'); const item = { isComplete: false, name: addNameTextbox.value.trim() }; fetch(uri, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(response => response.json()) .then(() => { getItems(); addNameTextbox.value = ''; }) .catch(error => console.error('Unable to add item.', error)); } function deleteItem(id) { fetch(`${uri}/${id}`, { method: 'DELETE' }) .then(() => getItems()) .catch(error => console.error('Unable to delete item.', error)); } function displayEditForm(id) { const item = todos.find(item => item.id === id); document.getElementById('edit-name').value = item.name; document.getElementById('edit-id').value = item.id; document.getElementById('edit-isComplete').checked = item.isComplete; document.getElementById('editForm').style.display = 'block'; } function updateItem() { const itemId = document.getElementById('edit-id').value; const item = { id: parseInt(itemId, 10), isComplete: document.getElementById('edit-isComplete').checked, name: document.getElementById('edit-name').value.trim() }; fetch(`${uri}/${itemId}`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(() => getItems()) .catch(error => console.error('Unable to update item.', error)); closeInput(); return false; } function closeInput() { document.getElementById('editForm').style.display = 'none'; } function _displayCount(itemCount) { const name = (itemCount === 1) ? 'to-do' : 'to-dos'; document.getElementById('counter').innerText = `${itemCount} ${name}`; } function _displayItems(data) { const tBody = document.getElementById('todos'); tBody.innerHTML = ''; _displayCount(data.length); const button = document.createElement('button'); data.forEach(item => { let isCompleteCheckbox = document.createElement('input'); isCompleteCheckbox.type = 'checkbox'; isCompleteCheckbox.disabled = true; isCompleteCheckbox.checked = item.isComplete; let editButton = button.cloneNode(false); editButton.innerText = 'Edit'; editButton.setAttribute('onclick', `displayEditForm(${item.id})`); let deleteButton = button.cloneNode(false); deleteButton.innerText = 'Delete'; deleteButton.setAttribute('onclick', `deleteItem(${item.id})`); let tr = tBody.insertRow(); let td1 = tr.insertCell(0); td1.appendChild(isCompleteCheckbox); let td2 = tr.insertCell(1); let textNode = document.createTextNode(item.name); td2.appendChild(textNode); let td3 = tr.insertCell(2); td3.appendChild(editButton); let td4 = tr.insertCell(3); td4.appendChild(deleteButton); }); todos = data; }
Möglicherweise ist eine Änderung an den Starteinstellungen des ASP.NET Core-Projekts erforderlich, um die HTML-Seite lokal zu testen:
- Öffnen Sie Properties\launchSettings.json.
- Entfernen Sie die
launchUrl
-Eigenschaft, um zu erzwingen, dass die App mitindex.html
als Startseite geöffnet wird. Dies ist die Standarddatei des Projekts.
Dieses Beispiel ruft alle CRUD-Methoden der Web-API auf. Im Folgenden werden die Web-API-Aufrufe erläutert.
Abrufen einer Liste von To-Do-Elementen
Im folgenden Code wird eine HTTP GET-Anforderung an die Route api/todoitems gesendet:
fetch(uri)
.then(response => response.json())
.then(data => _displayItems(data))
.catch(error => console.error('Unable to get items.', error));
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion _displayItems
aufgerufen. Jedes To-Do-Element im array-Parameter, das von _displayItems
akzeptiert wird, wird der Tabelle mit den Schaltflächen Bearbeiten und Löschen hinzugefügt. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Hinzufügen eines To-Do-Elements
Im folgenden Code wird Folgendes ausgeführt:
- Eine
item
-Variable wird deklariert, um eine Objektliteraldarstellung des To-Do-Elements zu erstellen. - Eine Fetch-Anforderung wird mit den folgenden Optionen konfiguriert:
method
gibt das POST HTTP-Aktionsverb an.body
gibt die JSON-Darstellung des Anforderungstexts an. Die JSON wird erzeugt, indem das initem
gespeicherte Objektliteral an die Funktion JSON.stringify übergeben wird.headers
gibt die HTTP-AnforderungsheaderAccept
undContent-Type
an. Beide Header sind aufapplication/json
festgelegt, um den gesendeten und empfangenen Medientyp anzugeben.
- Eine HTTP POST-Anforderung wird an die Route api/todoitems gesendet.
function addItem() {
const addNameTextbox = document.getElementById('add-name');
const item = {
isComplete: false,
name: addNameTextbox.value.trim()
};
fetch(uri, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(response => response.json())
.then(() => {
getItems();
addNameTextbox.value = '';
})
.catch(error => console.error('Unable to add item.', error));
}
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion getItems
aufgerufen, um die HTML-Tabelle zu aktualisieren. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Aktualisieren eines To-Do-Elements
Das Aktualisieren eines To-Do-Elements funktioniert sehr ähnlich wie das Hinzufügen. Allerdings gibt es zwei wesentliche Unterschiede:
- Die Route erhält den eindeutigen Bezeichner des zu aktualisierenden Elements als Suffix. Beispiel: api/todoitems/1
- Das HTTP-Aktionsverb ist PUT, wie durch die Option
method
angegeben.
fetch(`${uri}/${itemId}`, {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(() => getItems())
.catch(error => console.error('Unable to update item.', error));
Löschen eines To-Do-Elements
Um ein To-Do-Element zu löschen, legen Sie die method
-Option der Anforderung auf DELETE
fest, und geben Sie den eindeutigen Bezeichner des Elements in der URL an.
fetch(`${uri}/${id}`, {
method: 'DELETE'
})
.then(() => getItems())
.catch(error => console.error('Unable to delete item.', error));
Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Web-API-Hilfeseiten generieren:
In diesem Tutorial erfahren Sie, wie Sie eine ASP.NET Core-Web-API über die Fetch-API mit JavaScript aufrufen.
Voraussetzungen
- Sie haben Tutorial: Erstellen einer Web-API abgeschlossen.
- Sie sind mit CSS, HTML und JavaScript vertraut.
Aufrufen der Web-API mit JavaScript
In diesem Abschnitt fügen Sie eine HTML-Seite hinzu, die Formulare zum Erstellen und Verwalten von To-Do-Elementen enthält. An die Elemente auf der Seite sind Ereignishandler angefügt. Die Ereignishandler führen zu HTTP-Anforderungen an die Aktionsmethoden der Web-API. Die Funktion fetch
der Fetch-API initiiert jede HTTP-Anforderung.
Die Funktion fetch
gibt ein Promise
-Objekt zurück, das eine HTTP-Antwort in Form eines Response
-Objekts enthält. Ein gängiges Muster besteht darin, den JSON-Antworttext durch Aufrufen der json
-Funktion im Response
-Objekt zu extrahieren. JavaScript aktualisiert die Seite mit den Details aus der Antwort der Web-API.
Ein sehr einfacher fetch
-Aufruf akzeptiert einen einzelnen Parameter, der die Route darstellt. Ein zweiter Parameter, der als init
-Objekt bezeichnet wird, ist optional. init
wird zum Konfigurieren der HTTP-Anforderung verwendet.
- Konfigurieren Sie die App so, dass statische Dateien unterstützt werden und die Standarddateizuordnung aktiviert wird. Der folgende hervorgehobene Code ist in
Program.cs
erforderlich:
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
var app = builder.Build();
if (builder.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Erstellen Sie im Stammverzeichnis den Ordner wwwroot.
Erstellen Sie einen css-Ordner im wwwroot-Ordner.
Erstellen Sie einen js- Ordner innerhalb des ordners wwwroot.
Fügen Sie eine HTML-Datei namens
index.html
zum wwwroot-Ordner hinzu. Ersetzen Sie den Inhalt vonindex.html
durch das folgende Markup:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>To-do CRUD</title> <link rel="stylesheet" href="css/site.css" /> </head> <body> <h1>To-do CRUD</h1> <h3>Add</h3> <form action="javascript:void(0);" method="POST" onsubmit="addItem()"> <input type="text" id="add-name" placeholder="New to-do"> <input type="submit" value="Add"> </form> <div id="editForm"> <h3>Edit</h3> <form action="javascript:void(0);" onsubmit="updateItem()"> <input type="hidden" id="edit-id"> <input type="checkbox" id="edit-isComplete"> <input type="text" id="edit-name"> <input type="submit" value="Save"> <a onclick="closeInput()" aria-label="Close">✖</a> </form> </div> <p id="counter"></p> <table> <tr> <th>Is Complete?</th> <th>Name</th> <th></th> <th></th> </tr> <tbody id="todos"></tbody> </table> <script src="js/site.js" asp-append-version="true"></script> <script type="text/javascript"> getItems(); </script> </body> </html>
Fügen Sie eine CSS-Datei namens
site.css
zum Ordner wwwroot/css hinzu. Ersetzen Sie den Inhalt der Dateisite.css
durch die folgenden Formatvorlagen:input[type='submit'], button, [aria-label] { cursor: pointer; } #editForm { display: none; } table { font-family: Arial, sans-serif; border: 1px solid; border-collapse: collapse; } th { background-color: #f8f8f8; padding: 5px; } td { border: 1px solid; padding: 5px; }
Fügen Sie eine JavaScript-Datei namens
site.js
zum Ordner wwwroot/js hinzu. Ersetzen Sie den Inhalt vonsite.js
durch den folgenden Code.const uri = 'api/todoitems'; let todos = []; function getItems() { fetch(uri) .then(response => response.json()) .then(data => _displayItems(data)) .catch(error => console.error('Unable to get items.', error)); } function addItem() { const addNameTextbox = document.getElementById('add-name'); const item = { isComplete: false, name: addNameTextbox.value.trim() }; fetch(uri, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(response => response.json()) .then(() => { getItems(); addNameTextbox.value = ''; }) .catch(error => console.error('Unable to add item.', error)); } function deleteItem(id) { fetch(`${uri}/${id}`, { method: 'DELETE' }) .then(() => getItems()) .catch(error => console.error('Unable to delete item.', error)); } function displayEditForm(id) { const item = todos.find(item => item.id === id); document.getElementById('edit-name').value = item.name; document.getElementById('edit-id').value = item.id; document.getElementById('edit-isComplete').checked = item.isComplete; document.getElementById('editForm').style.display = 'block'; } function updateItem() { const itemId = document.getElementById('edit-id').value; const item = { id: parseInt(itemId, 10), isComplete: document.getElementById('edit-isComplete').checked, name: document.getElementById('edit-name').value.trim() }; fetch(`${uri}/${itemId}`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(item) }) .then(() => getItems()) .catch(error => console.error('Unable to update item.', error)); closeInput(); return false; } function closeInput() { document.getElementById('editForm').style.display = 'none'; } function _displayCount(itemCount) { const name = (itemCount === 1) ? 'to-do' : 'to-dos'; document.getElementById('counter').innerText = `${itemCount} ${name}`; } function _displayItems(data) { const tBody = document.getElementById('todos'); tBody.innerHTML = ''; _displayCount(data.length); const button = document.createElement('button'); data.forEach(item => { let isCompleteCheckbox = document.createElement('input'); isCompleteCheckbox.type = 'checkbox'; isCompleteCheckbox.disabled = true; isCompleteCheckbox.checked = item.isComplete; let editButton = button.cloneNode(false); editButton.innerText = 'Edit'; editButton.setAttribute('onclick', `displayEditForm(${item.id})`); let deleteButton = button.cloneNode(false); deleteButton.innerText = 'Delete'; deleteButton.setAttribute('onclick', `deleteItem(${item.id})`); let tr = tBody.insertRow(); let td1 = tr.insertCell(0); td1.appendChild(isCompleteCheckbox); let td2 = tr.insertCell(1); let textNode = document.createTextNode(item.name); td2.appendChild(textNode); let td3 = tr.insertCell(2); td3.appendChild(editButton); let td4 = tr.insertCell(3); td4.appendChild(deleteButton); }); todos = data; }
Möglicherweise ist eine Änderung an den Starteinstellungen des ASP.NET Core-Projekts erforderlich, um die HTML-Seite lokal zu testen:
- Öffnen Sie Properties\launchSettings.json.
- Entfernen Sie die
launchUrl
-Eigenschaft, um zu erzwingen, dass die App mitindex.html
als Startseite geöffnet wird. Dies ist die Standarddatei des Projekts.
Dieses Beispiel ruft alle CRUD-Methoden der Web-API auf. Im Folgenden werden die Web-API-Aufrufe erläutert.
Abrufen einer Liste von To-Do-Elementen
Im folgenden Code wird eine HTTP GET-Anforderung an die Route api/todoitems gesendet:
fetch(uri)
.then(response => response.json())
.then(data => _displayItems(data))
.catch(error => console.error('Unable to get items.', error));
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion _displayItems
aufgerufen. Jedes To-Do-Element im array-Parameter, das von _displayItems
akzeptiert wird, wird der Tabelle mit den Schaltflächen Bearbeiten und Löschen hinzugefügt. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Hinzufügen eines To-Do-Elements
Im folgenden Code wird Folgendes ausgeführt:
- Eine
item
-Variable wird deklariert, um eine Objektliteraldarstellung des To-Do-Elements zu erstellen. - Eine Fetch-Anforderung wird mit den folgenden Optionen konfiguriert:
method
gibt das POST HTTP-Aktionsverb an.body
gibt die JSON-Darstellung des Anforderungstexts an. Die JSON wird erzeugt, indem das initem
gespeicherte Objektliteral an die Funktion JSON.stringify übergeben wird.headers
gibt die HTTP-AnforderungsheaderAccept
undContent-Type
an. Beide Header sind aufapplication/json
festgelegt, um den gesendeten und empfangenen Medientyp anzugeben.
- Eine HTTP POST-Anforderung wird an die Route api/todoitems gesendet.
function addItem() {
const addNameTextbox = document.getElementById('add-name');
const item = {
isComplete: false,
name: addNameTextbox.value.trim()
};
fetch(uri, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(response => response.json())
.then(() => {
getItems();
addNameTextbox.value = '';
})
.catch(error => console.error('Unable to add item.', error));
}
Wenn die Web-API den Statuscode „Erfolgreich“ zurückgibt, wird die Funktion getItems
aufgerufen, um die HTML-Tabelle zu aktualisieren. Wenn die Web-API-Anforderung nicht erfolgreich ausgeführt wird, wird in der Browserkonsole ein Fehler protokolliert.
Aktualisieren eines To-Do-Elements
Das Aktualisieren eines To-Do-Elements funktioniert sehr ähnlich wie das Hinzufügen. Allerdings gibt es zwei wesentliche Unterschiede:
- Die Route erhält den eindeutigen Bezeichner des zu aktualisierenden Elements als Suffix. Beispiel: api/todoitems/1
- Das HTTP-Aktionsverb ist PUT, wie durch die Option
method
angegeben.
fetch(`${uri}/${itemId}`, {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(item)
})
.then(() => getItems())
.catch(error => console.error('Unable to update item.', error));
Löschen eines To-Do-Elements
Um ein To-Do-Element zu löschen, legen Sie die method
-Option der Anforderung auf DELETE
fest, und geben Sie den eindeutigen Bezeichner des Elements in der URL an.
fetch(`${uri}/${id}`, {
method: 'DELETE'
})
.then(() => getItems())
.catch(error => console.error('Unable to delete item.', error));
Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Web-API-Hilfeseiten generieren: