Märkus.
Juurdepääs sellele lehele nõuab autoriseerimist. Võite proovida sisse logida või kausta vahetada.
Juurdepääs sellele lehele nõuab autoriseerimist. Võite proovida kausta vahetada.
Selles juhendis saate häälestada veebilehe ja kohandatud veebimalli, mis kasutab serveri loogikat kontaktitabeli kirjete lugemiseks, kirjutamiseks, värskendamiseks ja kustutamiseks.
1. samm: looge serveriloogika
Logige sisse Power Pages'i.
Valige sait + redigeerimine.
Liikuge tööruumi Häälestamine ja seejärel valige Serveri loogika (eelvaade).
Valige +Uus serveriloogika.
Sisestage serveri loogika nimi. Seda nime kasutatakse API-s ressursi identifikaatorina serveri loogika API loomisel.
Näide: dataverse-crud-operations
Sobiva veebirolli määramiseks valige +Lisa rollid .
Valige nime kõrval 3 punkti (...) ja valige Redigeeri koodi.
Kohandatud loogika loomiseks valige Ava Visual Studio Code . Failist leiate eelmääratletud meetodid ja skriptid.
Määratlege serveri loogikameetod kontaktikirjete lugemiseks, redigeerimiseks, loomiseks ja kustutamiseks.
Loe: Lisage allolev skript get-meetodisse
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); }Loo: Lisage allpool skript postituse meetodisse
const data = Server.Context.Body; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.CreateRecord(entitySetName, data);Värskendus: lisage allpool skript put-meetodil
const id = Server.Context.QueryParameters["id"]; const data = Server.Context.Body; return Server.Connector.Dataverse.UpdateRecord("accounts", id, data);Kustuta: Lisa meetodi sisse del
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);Salvestage fail.
Siin on täielik serveri loogikakood, mida saab kleepida
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 }); } }
2. samm: veebilehe loomine
Käivitage Power Pages'i kujundusstuudio.
Valige tööruumis Lehed + Leht.
Sisestage dialoogiboksis Lehe lisamine väljale Nimi tekst Serveri loogika ja valige Alusta tühjast paigutusest.
Valige suvand Lisa.
Valige paremas ülanurgas suvand Muuda koodi .
Valige Ava Visual Studio Code.
Kopeerige järgmine näidiskoodilõik ja kleepige see lehejaotise siltide vahele
<div></div>.<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>
3. etapp: konfigureerige õigused
Veebirolli loomine
Kui teil pole praegu veebirolli, millel oleks õigused tabelile, millele pääsete juurde serveriloogika kaudu, või vajate andmetele juurdepääsuks teistsugust konteksti, näitavad järgmised juhised, kuidas luua uus veebiroll ja määrata tabeliõigusi.
- Käivitage rakendus Portaalihaldus.
- Valige vasakpoolsel paanil jaotises Turvalisus suvand Veebirollid.
- Tehke valik Uus.
- Sisestage väljale NimiServeriloogika kasutaja (või mis tahes nimi, mis kajastab kõige paremini seda funktsiooni kasutava kasutaja rolli).
- Valige loendist Veebisait oma veebisaidi kirje.
- Valige käsk Salvesta.
Tabeli õiguste loomine
- Käivitage Power Pages'i kujundusstuudio.
- Valige tööruum Turvalisus .
- Valige jaotises Kaitse suvand Tabeliõigused.
- Valige Uus luba.
- Sisestage väljale Nimi tekst Kontaktitabeli õigus.
- Valige loendist Tabeli nimiKontakt (kontakt).
- Valige loendist Juurdepääsu tüüpväärtus Globaalne.
- Valige Lugemis-, Kirjuta-, Loo- ja Kustutamisõigused .
- Valige + Lisa rollid ja valige varem valitud või loodud veebiroll .
- Valige Salvesta & Sule.
Kontaktide lisamine veebirolli
- Käivitage rakendus Portaalihaldus.
- Valige vasakpoolsel paanil jaotises Turvalisus suvand Kontaktid.
- Valige kontakt, mida soovite selles näites serveriloogika jaoks kasutada.
Märkus
See kontakt on kasutajakonto, mida kasutatakse selles näites serveri loogika testimiseks. Valige portaalis kindlasti õige kontakt.
- Valige Seotud>veebirollid.
- Valige Lisa olemasolev veebiroll.
- Valige varem loodud kasutajaroll Serveri loogika .
- Valige suvand Lisa.
- Valige Salvesta & Sule.
4. etapp: serveriloogika kasutamine lugemiseks, vaatamiseks, redigeerimiseks, loomiseks ja kustutamiseks
Veebi API funktsionaalsuse testimiseks tehke järgmist.
- Valige Eelvaade ja seejärel valige Töölaud.
- Logige saidile sisse kasutajakontoga, millele on määratud varem loodud kasutajaroll Serveri loogika .
- Minge varem loodud serveriloogika veebilehele.
Seotud teave
Serveri loogika ülevaade
Autori serveri loogika
Serveri objektid