Toimintatapa: Käsittele Dataverse-taulukoita palvelinlogiikan avulla

Tässä oppaassa määrität verkkosivun ja mukautetun verkkomallin, joka käyttää palvelinlogiikkaa tietueiden lukemiseen, kirjoittamiseen, päivittämiseen ja poistamiseen yhteystietotaulukosta.

Vaihe 1: Luo palvelinlogiikka

  1. Kirjaudu sisään Power Pagesiin.

  2. Valitse sivusto + Muokkaa.

  3. Siirry Määritä työtila -kohtaan ja valitse sitten Palvelinlogiikka (esikatselu).

  4. Valitse +Uusi palvelimen logiikka.

  5. Anna palvelinlogiikan nimi. Tätä nimeä käytetään ohjelmointirajapinnassa resurssitunnisteena palvelinlogiikan ohjelmointirajapintaa muodostettaessa.

    Esimerkki: dataverse-crud-operations

  6. Valitse +Lisää rooleja , jos haluat määrittää asianmukaisen verkkoroolin.

  7. Valitse kolme pistettä (...) nimen vierestä ja valitse Muokkaa koodia.

  8. Luo mukautettu logiikka valitsemalla Avaa Visual Studio Code . Tiedostosta löydät esimääritettyjä menetelmiä ja komentosarjoja.

  9. Määritä palvelimen logiikkamenetelmä yhteystietojen lukemiseen, muokkaamiseen, luomiseen ja poistamiseen.

    Lue: Lisää alla oleva komentosarja Get-menetelmän sisällä

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

    Luo: Lisää alla oleva komentosarja julkaise-menetelmässä

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

    Päivitä: Lisää alla oleva komentosarja put-menetelmään

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

    Poista: Lisää del-menetelmän sisällä

    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. Tallenna tiedosto.

  11. Tässä on palvelimen koko logiikkakoodi, joka voidaan liittää.

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

Vaihe 2: Verkkosivun luominen

  1. Käynnistä Power Pagesin suunnittelustudio.

  2. Valitse Sivut-työtilassa+ Sivu.

  3. Kirjoita Lisää sivu -valintaikkunassa Palvelimen logiikkaNimi-ruutuun ja valitse Aloita tyhjästä -asettelu.

  4. Valitse Lisää.

  5. Valitse Muokkaa koodia - vaihtoehto oikeasta yläkulmasta.

  6. Valitse Avaa Visual Studio Code.

  7. Kopioi seuraava mallikoodikatkelman ja liitä se sivuosion <div></div> tunnisteiden väliin.

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

Vaihe 3: Käyttöoikeuksien määrittäminen

Verkkoroolin luominen

Jos sinulla ei tällä hetkellä ole verkkoroolia, jolla on käyttöoikeudet taulukkoon, jota käytät palvelinlogiikan kautta tai joka edellyttää eri kontekstia tietojen käyttämiseen, seuraavissa vaiheissa näytetään, miten voit luoda uuden verkkoroolin ja määrittää taulukon käyttöoikeudet.

  1. Käynnistä portaalin hallintasovellus.
  2. Valitse vasemmanpuoleisessa ruudussa Suojaus-osassa Verkkoroolit.
  3. Valitse Uusi.
  4. Kirjoita Nimi-ruutuunPalvelinlogiikan käyttäjä (tai mikä tahansa nimi, joka parhaiten kuvastaa käyttäjän roolia, joka käyttää tätä toimintoa).
  5. Valitse Sivusto-luettelosta sivustotietueesi.
  6. Valitse Tallenna.

Luo taulukon oikeudet

  1. Käynnistä Power Pagesin suunnittelustudio.
  2. Valitse Suojaus-työtila .
  3. Valitse Suojaa-osiossaTaulukon käyttöoikeudet.
  4. Valitse Uusi käyttöoikeus.
  5. Kirjoita Nimi-ruutuunYhteyshenkilötaulukon käyttöoikeus.
  6. Valitse Taulukon nimi - luettelosta Yhteyshenkilö (yhteyshenkilö).
  7. Valitse Käyttöoikeustyyppi-luettelostaYleinen.
  8. Valitse Luku-, Kirjoitus-, Luo- ja Poista-oikeudet .
  9. Valitse + Lisää rooleja ja valitse verkkorooli , jonka valitsit tai loit aiemmin.
  10. Valitse Tallenna & sulje.

Yhteystietojen lisääminen verkkorooliin

  1. Käynnistä portaalin hallintasovellus.
  2. Valitse vasemmassa ruudussa Suojaus-osassaYhteystiedot.
  3. Valitse yhteyshenkilö, jota haluat käyttää tässä esimerkissä palvelinlogiikan kannalta.

    Note

    Tämä yhteyshenkilö on käyttäjätili, jota tässä esimerkissä käytetään palvelinlogiikan testaamiseen. Varmista, että valitset oikean yhteyshenkilön portaalissasi.

  4. Valitse Liittyvät>verkkoroolit.
  5. Valitse Lisää aiemmin luotu verkkorooli.
  6. Valitse palvelinlogiikan käyttäjärooli , joka on luotu aiemmin.
  7. Valitse Lisää.
  8. Valitse Tallenna & sulje.

Vaihe 4: Palvelinlogiikan käyttö lukemiseen, tarkasteluun, muokkaamiseen, luomiseen ja poistamiseen

Voit testata WWW-ohjelmointirajapinnan toimintoja seuraavasti:

  1. Valitse Esikatselu ja sitten Työpöytä.
  2. Kirjaudu sisään sivustoosi käyttäjätilillä, jolle on määritetty aiemmin luomasi Palvelinlogiikan käyttäjärooli .
  3. Siirry aiemmin luodulle Palvelinlogiikka-verkkosivulle .

Palvelinlogiikan yleiskatsaus
Laatijapalvelimen logiikka
Palvelinobjektit