Pastaba.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti prisijungti arba pakeisti katalogus.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti pakeisti katalogus.
Šiame vadove nustatysite tinklalapį ir pasirinktinį žiniatinklio šabloną, kuris naudos serverio logiką įrašams iš kontaktų lentelės skaityti, rašyti, atnaujinti ir naikinti.
1 veiksmas: sukurkite serverio logiką
Prisijunkite prie "Power Pages".
Pasirinkite svetainę + Redaguoti.
Eikite į darbo sritį Nustatyti , tada pasirinkite Serverio logika (peržiūra).
Pasirinkite +Nauja serverio logika.
Įveskite serverio logikos pavadinimą. Šis pavadinimas naudojamas API kaip išteklių identifikatorius kuriant serverio logikos API.
Pavyzdys: dataverse-crud-operations
Pasirinkite + Įtraukti vaidmenis , kad priskirtumėte atitinkamą žiniatinklio vaidmenį.
Pasirinkite 3 taškus (...) šalia pavadinimo ir pasirinkite Redaguoti kodą.
Pasirinkite Atidaryti "Visual Studio" kodą , kad sukurtumėte pasirinktinę logiką. Faile rasite iš anksto nustatytus metodus ir scenarijus.
Apibrėžkite serverio loginį metodą kontaktų įrašams skaityti, redaguoti, kurti, naikinti.
Skaitykite: Pridėkite žemiau esantį scenarijų viduje gauti metodą
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); }Sukurti: Pridėti žemiau scenarijų po metodas
const data = Server.Context.Body; const entitySetName = Server.Context.QueryParameters["entitySetName"]; return Server.Connector.Dataverse.CreateRecord(entitySetName, data);Atnaujinti: Pridėti žemiau scenarijų įdėti metodas
const id = Server.Context.QueryParameters["id"]; const data = Server.Context.Body; return Server.Connector.Dataverse.UpdateRecord("accounts", id, data);Ištrinti: Pridėti viduje del metodas
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);Įrašykite failą.
Štai visas serverio loginis kodas, kurį galima įklijuoti
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 veiksmas: sukurkite tinklalapį
Paleiskite "Power Pages" dizaino studiją.
Darbo srityje Puslapiai pasirinkite + Puslapis.
Dialogo lange Puslapio įtraukimas lauke Pavadinimas įveskite Serverio logika ir pasirinkite Pradėti nuo tuščio maketo.
Pasirinkite Įtraukti.
Viršutiniame dešiniajame kampe pasirinkite parinktį Redaguoti kodą .
Pasirinkite Atidaryti "Visual Studio Code".
Nukopijuokite šį kodo fragmento pavyzdį ir įklijuokite jį tarp
<div></div>puslapio skilties žymų.<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 veiksmas: sukonfigūruokite leidimus
Žiniatinklio vaidmens kūrimas
Jei šiuo metu neturite žiniatinklio vaidmens su teisėmis į lentelę, kurią pasiekiate naudodami serverio logiką, arba reikia kitokio prieigos prie duomenų konteksto, toliau nurodyti veiksmai parodys, kaip sukurti naują žiniatinklio vaidmenį ir priskirti lentelės teises.
- Paleiskite portalo valdymo programą.
- Kairiojoje srityje skyriuje Sauga pasirinkite Žiniatinklio vaidmenys.
- Pasirinkite Naujas.
- Lauke Pavadinimas įveskite Serverio logika Vartotojas (arba bet koks vardas, geriausiai atspindintis vartotojo, naudojančio šią funkciją, vaidmenį).
- Sąraše Svetainė pasirinkite savo svetainės įrašą.
- Pasirinkite Įrašyti.
Kurti lentelės teises
- Paleiskite "Power Pages" dizaino studiją.
- Pasirinkite darbo sritį Sauga .
- Skiltyje Apsaugoti pasirinkite Lentelės teisės.
- Pasirinkite Naujas leidimas.
- Lauke Pavadinimas įveskite Kontaktų lentelės teisės.
- Sąraše Lentelės pavadinimas pasirinkite Kontaktas (kontaktas).
- Sąraše Prieigos tipas pasirinkite Visuotinis.
- Pasirinkite Skaityti, Rašyti, Kurti ir Naikinti teises.
- Pasirinkite + Įtraukti vaidmenis ir pasirinkite žiniatinklio vaidmenį , kurį pasirinkote arba sukūrėte anksčiau.
- Pasirinkite Išsaugoti & Uždaryti.
Kontaktų įtraukimas į žiniatinklio vaidmenį
- Paleiskite portalo valdymo programą.
- Kairiojoje srityje skyriuje Sauga pasirinkite Kontaktai.
- Pasirinkite kontaktą, kurį norite naudoti šiame serverio logikos pavyzdyje.
Pastaba.
Šis kontaktas yra vartotojo abonementas, naudojamas šiame pavyzdyje serverio logikai tikrinti. Būtinai pasirinkite tinkamą kontaktą savo portale.
- Pasirinkite Susiję>žiniatinklio vaidmenys.
- Pasirinkite Įtraukti esamą žiniatinklio vaidmenį.
- Pasirinkite anksčiau sukurtą serverio logikos vartotojo vaidmenį.
- Pasirinkite Įtraukti.
- Pasirinkite Išsaugoti & Uždaryti.
4 veiksmas: serverio logikos naudojimas skaitymui, peržiūrai, redagavimui, kūrimui ir naikinimui
Norėdami išbandyti žiniatinklio API funkcijas:
- Pasirinkite Peržiūra, tada pasirinkite Darbalaukis.
- Prisijunkite prie svetainės naudodami vartotojo abonementą, kuriam priskirtas anksčiau sukurtas serverio logikos vartotojo vaidmuo.
- Eikite į anksčiau sukurtą serverio logikos tinklalapį.
Susijusi informacija
Serverio logikos apžvalga
Autoriaus serverio logika
Serverio objektai