Slik samhandler du med dataverse tabeller ved hjelp av serverlogikk

I denne veiledningen skal du konfigurere en nettside og egendefinert nettmal som bruker serverlogikken til å lese, skrive, oppdatere og slette poster fra kontakttabellen.

Trinn 1: Opprette en serverlogikk

  1. Logg på Power Pages.

  2. Velg område + Rediger.

  3. Gå til konfigurer arbeidsområdet, og velg deretter Serverlogikk (forhåndsvisning).

  4. Velg +Ny serverlogikk.

  5. Skriv inn navnet på serverlogikken. Dette navnet brukes i API som ressursidentifikator under bygging av serverlogikk-API-en.

    Eksempel: dataverse-crud-operasjoner

  6. Velg +Legg til roller for å tilordne riktig nettrolle.

  7. Velg tre prikker (...) ved siden av navnet, og velg Rediger kode.

  8. Velg Åpne Visual Studio Code for å redigere den egendefinerte logikken. Du finner forhåndsdefinerte metoder og skript i filen.

  9. Definer serverlogikkmetoden for å lese, redigere, opprette, slette kontaktoppføringene.

    Les: Legg til nedenfor skript 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);
    }
    

    Opprett: Legg til skriptet under i postmetoden

    const data = Server.Context.Body;
    const entitySetName = Server.Context.QueryParameters["entitySetName"];
    return Server.Connector.Dataverse.CreateRecord(entitySetName, data);
    

    Oppdatering: Legg til nedenforstående skript i put-metoden

    const id = Server.Context.QueryParameters["id"];
    const data = Server.Context.Body;
    return Server.Connector.Dataverse.UpdateRecord("accounts", id, data);
    

    Slett: Legg til 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);
    
  10. Lagre filen.

  11. Her er den fullstendige serverlogikkkoden som kan limes inn

    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 });
     }
     }
    

Trinn 2: Opprette nettside

  1. Start power pages-utformingsstudioet.

  2. Velg + Side i Sider-arbeidsområdet.

  3. Skriv inn Serverlogikk i Navn-boksen i dialogboksen Legg til en side, og velg Start fra tomt oppsett.

  4. Velg Legg til.

  5. Velg alternativet Rediger kode øverst til høyre.

  6. Velg Åpne Visual Studio Code.

  7. Kopier følgende kodesnutt og lim den <div></div> inn mellom kodene i sideinndelingen.

    <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>
    

Trinn 3: Konfigurere tillatelser

Opprette en nettrolle

Hvis du for øyeblikket ikke har en nettrolle med tillatelser til tabellen du har tilgang til gjennom serverlogikken eller krever en annen kontekst for å få tilgang til dataene, viser fremgangsmåten nedenfor deg hvordan du oppretter en ny nettrolle og tilordner tabelltillatelser.

  1. Start portalbehandlingsappen.
  2. Velg Nettroller i Sikkerhets-delen i ruten til venstre.
  3. Velg Ny.
  4. Skriv inn Serverlogikkbruker (eller et hvilket som helst navn som best gjenspeiler rollen til brukeren som får tilgang til denne funksjonaliteten).
  5. Velg nettstedsoppføringen i nettstedslisten .
  6. Velg Lagre.

Opprett tabelltillatelser

  1. Start power pages-utformingsstudioet.
  2. Velg sikkerhetsarbeidsområdet .
  3. Velg Tabelltillatelser under Beskytt-delen.
  4. Velg Ny tillatelse.
  5. Skriv inn kontakttabelltillatelse i Navn-boksen.
  6. Velg Kontakt (kontakt) i tabellnavnlisten.
  7. Velg Global i Access Type-listen.
  8. Velg lese-, skrive-, opprett- og sletterettigheter .
  9. Velg + Legg til roller , og velg nettrollen du valgte eller opprettet tidligere.
  10. Velg Lagre og lukk.

Legge til kontakter i nettrollen

  1. Start portalbehandlingsappen.
  2. Velg Kontakter i Sikkerhets-delen i ruten til venstre.
  3. Velg en kontakt du vil bruke i dette eksemplet for serverlogikken.

    Note

    Denne kontakten er brukerkontoen som brukes i dette eksemplet for testing av serverlogikken. Pass på at du velger riktig kontakt i portalen.

  4. Velg Relatert>Nettroller.
  5. Velg Legg til eksisterende webrolle.
  6. Velg serverlogikkens brukerrolle , opprettet tidligere.
  7. Velg Legg til.
  8. Velg Lagre og lukk.

Trinn 4: Bruk serverlogikken til å lese, vise, redigere, opprette og slette

Slik tester du web-API-funksjonaliteten:

  1. Velg Forhåndsvisning, og velg deretter Skrivebord.
  2. Logg på nettstedet med brukerkontoen som har blitt tilordnet serverlogikkens brukerrolle du opprettet tidligere.
  3. Gå til serverlogikkens nettside som ble opprettet tidligere.

Oversikt over serverlogikk
Redigeringsserverlogikk
Serverobjekter