Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
I denne vejledning skal du konfigurere en webside og en brugerdefineret webskabelon, der bruger serverlogikken til at læse, skrive, opdatere og slette poster fra kontakttabellen.
Trin 1: Opret en serverlogik
Log på Power Pages.
Vælg websted + Rediger.
Gå til Konfigurer arbejdsområde, og vælg derefter Serverlogik (prøveversion).
Vælg +Ny serverlogik.
Angiv navnet på serverlogikken. Dette navn bruges i API'en som ressource-id under oprettelse af serverlogik-API'en.
Eksempel: dataverse-crud-operations
Vælg +Tilføj roller for at tildele den relevante webrolle.
Vælg 3 prikker (...) ud for navn, og vælg Rediger kode.
Vælg Åbn Visual Studio Code for at oprette den brugerdefinerede logik. Du kan finde foruddefinerede metoder og scripts i filen.
Definer metoden serverlogik for at læse, redigere, oprette og slette kontaktposterne.
Læs: Tilføj nedenstående script i get-metoden
const entitySetName = Server.Context.QueryParameters["entitySetName"]; if (!Server.Context.QueryParameters["id"]) { return Server.Connector.Dataverse.RetrieveMultipleRecords(entitySetName); } else { const id = Server.Context.QueryParameters["id"]; // Context reference return Server.Connector.Dataverse.RetrieveRecord(entitySetName, id); }Opret: Tilføj scriptet nedenfor i postmetoden
const data = Server.Context.Body; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.CreateRecord(entitySetName, data);Opdatering: Tilføj scriptet nedenfor i put-metoden
const id = Server.Context.QueryParameters["id"]; const data = Server.Context.Body; return Server.Connector.Dataverse.UpdateRecord("accounts", id, data);Slet: Tilføj i del-metoden
const id = Server.Context.QueryParameters["id"]; const entitySetName = Server.Context.QueryParameters["entitySetName"]; Server.Logger.Log("Entity Set name:" + entitySetName); return Server.Connector.Dataverse.DeleteRecord(entitySetName, id);Gem filen.
Her er den komplette serverlogikkode, der kan indsættes
function get() { try { Server.Logger.Log("GET called"); // Logger reference const entitySetName = Server.Context.QueryParameters["entitySetName"]; const additionParameters = Server.Context.QueryParameters['additionalParameters']; if (!Server.Context.QueryParameters["id"]) { const response = Server.Connector.Dataverse.RetrieveMultipleRecords(entitySetName,additionParameters); return response; } else{ const id = Server.Context.QueryParameters["id"]; // Context reference const response = Server.Connector.Dataverse.RetrieveRecord(entitySetName, id,additionParameters); return response; } } catch (err) { Server.Logger.Error("GET failed: " + err.message); return JSON.stringify({ status: "error", method: "GET", message: err.message }); } } function post() { try { Server.Logger.Log("POST called"); const data = Server.Context.Body; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.CreateRecord(entitySetName, data); } catch (err) { Server.Logger.Error("POST failed: " + err.message); return JSON.stringify({ status: "error", method: "POST", message: err.message }); } } function put() { try { Server.Logger.Log("PUT called"); const id = Server.Context.QueryParameters["id"]; const data = Server.Context.Body; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.UpdateRecord(entitySetName, id, data); } catch (err) { Server.Logger.Error("PUT failed: " + err.message); return JSON.stringify({ status: "error", method: "PUT", message: err.message }); } } function del() { try { // "delete" keyword should not be used in script file. Server.Logger.Log("DEL called"); const id = Server.Context.QueryParameters["id"]; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.DeleteRecord(entitySetName, id); } catch (err) { Server.Logger.Error("Deletion failed: " + err.message); return JSON.stringify({ status: "error", method: "DEL", message: err.message }); } }
Trin 2: Opret webside
Start Power Pages-designstudiet.
I arbejdsområdet Sider skal du vælge + Side.
I dialogboksen Tilføj en side skal du angive Serverlogik i feltet Navn og vælge Start fra tomt layout.
Vælg Tilføj.
Vælg indstillingen Rediger kode i øverste højre hjørne.
Vælg Åbn Visual Studio Code.
Kopiér følgende kodestykkeeksempel, og indsæt det mellem
<div></div>koderne i sidesektionen.<style> #processingMsg { padding: 6px 12px; background: #eee; border-radius: 4px; position: fixed; top: 10px; left: 50%; transform: translateX(-50%); display: none; z-index: 9999; text-align: center; font-weight: bold; } table { border-collapse: collapse; width: 100%; margin-top: 10px; font-family: Arial, sans-serif; } th, td { border: 1px solid #ccc; padding: 6px; text-align: left; } button { cursor: pointer; border: 1px solid #aaa; padding: 4px 8px; border-radius: 4px; background: #fff; font-size: 14px; margin-right: 2px; } button.add { color: green; } button.save { color: green; } button.cancel { color: orange; } button.delete { color: red; } input { width: 95%; box-sizing: border-box; } td.actions { white-space: nowrap; } </style> <div id="processingMsg">Processing...</div> <div id="dataTable"></div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { // --- safeAjax wrapper --- (function(webapi, $) { function safeAjax(ajaxOptions) { var dfd = $.Deferred(); shell.getTokenDeferred().done(function(token) { ajaxOptions.headers = ajaxOptions.headers || {}; ajaxOptions.headers["__RequestVerificationToken"] = token; $.ajax(ajaxOptions) .done((data, ts, jq) => validateLoginSession(data, ts, jq, dfd.resolve)) .fail(dfd.reject); }).fail(() => dfd.rejectWith(this, arguments)); return dfd.promise(); } webapi.safeAjax = safeAjax; })(window.webapi = window.webapi || {}, jQuery); // --- notification banner --- const notify = (function() { const $m = $('#processingMsg'); let s = 0, t; return { show: (msg = 'Processing...') => { $m.text(msg); if (!s) clearTimeout(t), $m.show(); s++; }, hide: () => { s = Math.max(0, s - 1); if (!s) clearTimeout(t), t = setTimeout(() => $m.hide(), 300); } }; })(); function ajaxCall(msg, opts) { notify.show(msg); return webapi.safeAjax(opts) .fail(r => alert(r.responseJSON?.error?.message || 'Server logic not available')) .always(notify.hide); } // --- Table config --- const cols = [ { name: 'firstname', label: 'First Name' }, { name: 'lastname', label: 'Last Name' }, { name: 'emailaddress1', label: 'Email' }, { name: 'telephone1', label: 'Telephone' } ]; let data = []; function render() { const html = `<table> <thead> <tr> ${cols.map(c => `<th>${c.label}</th>`).join('')} <th>Actions <button class="add">➕</button></th> </tr> </thead> <tbody> ${data.map(r => `<tr data-id="${r.id}" data-name="${r.fullname}"> ${cols.map(c => `<td data-attribute="${c.name}" data-value="${r[c.name] || ''}">${r[c.name] || ''}</td>`).join('')} <td class="actions"> <button class="delete">🗑️</button> </td> </tr>`).join('')} </tbody> </table>`; $('#dataTable').html(html); } function addRecord(r) { data.unshift(r); render(); } function removeRecord(id) { data = data.filter(r => r.id !== id); render(); } function updateRecord(id, attr, val) { const r = data.find(r => r.id === id); if (r) { r[attr] = val; render(); } } // --- Events --- $('#dataTable').on('dblclick', 'tr', function() { const $tr = $(this); if ($tr.hasClass('editing')) return; // prevent double edit $tr.addClass('editing'); $tr.data('original', $tr.find('td[data-attribute]').map(function() { return $(this).text(); }).get()); $tr.find('td[data-attribute]').each(function() { const $td = $(this); const oldVal = $td.text(); $td.html(`<input type="text" value="${oldVal}" data-attr="${$td.data('attribute')}" />`); }); const $actions = $tr.find('td.actions'); $actions.append('<button class="save">✅</button><button class="cancel">❌</button>'); }); $('#dataTable').on('click', '.save', function() { const $tr = $(this).closest('tr'); const id = $tr.data('id'); const updates = {}; $tr.find('input').each(function() { updates[$(this).data('attr')] = $(this).val(); }); ajaxCall('Updating...', { type: 'PUT', url: `/_api/serverlogics/dataverse-crud-operations?entitySetName=contacts&id=${id}`, contentType: 'application/json', data: JSON.stringify(updates), success: () => { Object.assign(data.find(r => r.id === id), updates); render(); } }); }); $('#dataTable').on('click', '.cancel', function() { const $tr = $(this).closest('tr'); const original = $tr.data('original'); $tr.find('td[data-attribute]').each(function(i) { $(this).text(original[i]); }); $tr.removeClass('editing'); $tr.find('button.save, button.cancel').remove(); }); $('#dataTable').on('click', '.delete', function() { const $tr = $(this).closest('tr'); if (confirm('Delete "' + $tr.data('name') + '"?')) { ajaxCall('Deleting...', { type: 'DELETE', url: `/_api/serverlogics/dataverse-crud-operations?entitySetName=contacts&id=${$tr.data('id')}`, contentType: 'application/json', success: () => removeRecord($tr.data('id')) }); } }); $('#dataTable').on('click', '.add', function() { const r = { firstname: 'Alton', lastname: 'Stott' + Math.floor(Math.random() * 900 + 100), emailaddress1: 'Alton.Stott@contoso.com', telephone1: '555-123-4567' }; ajaxCall('Adding...', { type: 'POST', url: '/_api/serverlogics/dataverse-crud-operations?entitySetName=contacts', contentType: 'application/json', data: JSON.stringify(r), success: (res, s, xhr) => { r.id = xhr.getResponseHeader('entityid'); r.fullname = r.firstname + ' ' + r.lastname; addRecord(r); } }); }); ajaxCall('Loading...', { type: 'GET', url: '/_api/serverlogics/dataverse-crud-operations?entitySetName=contacts&additionalParameters=$select=fullname,firstname,lastname,emailaddress1,telephone1', contentType: 'application/json' }).done(res => { try { const p = JSON.parse(res.data); const b = JSON.parse(p.Body); data = (b.value || []).map(r => ({ ...r, id: r.contactid, fullname: r.fullname })); render(); } catch (e) { console.error(e); } }); }); </script>
Trin 3: Konfigurer tilladelser
Opret en webrolle
Hvis du i øjeblikket ikke har en webrolle med tilladelser til den tabel, du opretter adgang til via serverlogikken eller kræver en anden kontekst for at få adgang til dataene, viser følgende trin dig, hvordan du opretter en ny webrolle og tildeler tabeltilladelser.
- Start portaladministrationsappen.
- Vælg Webroller i sektionen Sikkerhed i ruden til venstre.
- Vælg Ny.
- I feltet Navn skal du angive Serverlogik Bruger (eller et hvilket som helst navn, der bedst afspejler rollen for den bruger, der har adgang til denne funktionalitet).
- I Websted-listen skal du vælge din webstedspost.
- Vælg Gem.
Oprette tabeltilladelser
- Start Power Pages-designstudiet.
- Vælg arbejdsområdet Sikkerhed .
- Under afsnittet Beskyt skal du vælge Tabeltilladelser.
- Vælg Ny tilladelse.
- I feltet Navn skal du skrive Tilladelse til kontakttabel.
- Vælg Kontakt (kontakt) på listen Tabelnavn.
- Vælg Global på listen Adgangstype.
- Vælg rettigheder som Læs, Skriv, Opret og Slet .
- Vælg + Tilføj roller , og vælg den webrolle, du har valgt eller oprettet tidligere.
- Vælg Gem og luk.
Føj kontakter til webrollen
- Start portaladministrationsappen.
- Vælg Kontakter i sektionen Sikkerhed i ruden til venstre.
- Vælg en kontakt, som du vil bruge i dette eksempel til serverlogik.
Notat
Denne kontakt er den brugerkonto, der bruges i dette eksempel til at teste serverlogikken. Sørg for at vælge den korrekte kontakt på portalen.
- Vælg Relaterede>web-roller.
- Vælg Tilføj eksisterende webrolle.
- Vælg brugerrollen Serverlogik , der er oprettet tidligere.
- Vælg Tilføj.
- Vælg Gem og luk.
Trin 4: Brug serverlogikken til at læse, få vist, redigere, oprette og slette
Sådan tester du web-API-funktionaliteten:
- Vælg Eksempel, og vælg derefter Desktop.
- Log på dit websted med den brugerkonto, der er tildelt rollen Serverlogikbruger , som du oprettede tidligere.
- Gå til websiden Serverlogik , der blev oprettet tidligere.
Relaterede oplysninger
Oversigt over serverlogik
Forfatterserverlogik
Serverobjekter