Kaip: sąveika su "Dataverse" lentelėmis naudojant serverio logiką

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

  1. Prisijunkite prie "Power Pages".

  2. Pasirinkite svetainę + Redaguoti.

  3. Eikite į darbo sritį Nustatyti , tada pasirinkite Serverio logika (peržiūra).

  4. Pasirinkite +Nauja serverio logika.

  5. Įveskite serverio logikos pavadinimą. Šis pavadinimas naudojamas API kaip išteklių identifikatorius kuriant serverio logikos API.

    Pavyzdys: dataverse-crud-operations

  6. Pasirinkite + Įtraukti vaidmenis , kad priskirtumėte atitinkamą žiniatinklio vaidmenį.

  7. Pasirinkite 3 taškus (...) šalia pavadinimo ir pasirinkite Redaguoti kodą.

  8. Pasirinkite Atidaryti "Visual Studio" kodą , kad sukurtumėte pasirinktinę logiką. Faile rasite iš anksto nustatytus metodus ir scenarijus.

  9. 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);
    
  10. Įrašykite failą.

  11. Š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į

  1. Paleiskite "Power Pages" dizaino studiją.

  2. Darbo srityje Puslapiai pasirinkite + Puslapis.

  3. Dialogo lange Puslapio įtraukimas lauke Pavadinimas įveskite Serverio logika ir pasirinkite Pradėti nuo tuščio maketo.

  4. Pasirinkite Įtraukti.

  5. Viršutiniame dešiniajame kampe pasirinkite parinktį Redaguoti kodą .

  6. Pasirinkite Atidaryti "Visual Studio Code".

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

  1. Paleiskite portalo valdymo programą.
  2. Kairiojoje srityje skyriuje Sauga pasirinkite Žiniatinklio vaidmenys.
  3. Pasirinkite Naujas.
  4. Lauke Pavadinimas įveskite Serverio logika Vartotojas (arba bet koks vardas, geriausiai atspindintis vartotojo, naudojančio šią funkciją, vaidmenį).
  5. Sąraše Svetainė pasirinkite savo svetainės įrašą.
  6. Pasirinkite Įrašyti.

Kurti lentelės teises

  1. Paleiskite "Power Pages" dizaino studiją.
  2. Pasirinkite darbo sritį Sauga .
  3. Skiltyje Apsaugoti pasirinkite Lentelės teisės.
  4. Pasirinkite Naujas leidimas.
  5. Lauke Pavadinimas įveskite Kontaktų lentelės teisės.
  6. Sąraše Lentelės pavadinimas pasirinkite Kontaktas (kontaktas).
  7. Sąraše Prieigos tipas pasirinkite Visuotinis.
  8. Pasirinkite Skaityti, Rašyti, Kurti ir Naikinti teises.
  9. Pasirinkite + Įtraukti vaidmenis ir pasirinkite žiniatinklio vaidmenį , kurį pasirinkote arba sukūrėte anksčiau.
  10. Pasirinkite Išsaugoti & Uždaryti.

Kontaktų įtraukimas į žiniatinklio vaidmenį

  1. Paleiskite portalo valdymo programą.
  2. Kairiojoje srityje skyriuje Sauga pasirinkite Kontaktai.
  3. 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.

  4. Pasirinkite Susiję>žiniatinklio vaidmenys.
  5. Pasirinkite Įtraukti esamą žiniatinklio vaidmenį.
  6. Pasirinkite anksčiau sukurtą serverio logikos vartotojo vaidmenį.
  7. Pasirinkite Įtraukti.
  8. 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:

  1. Pasirinkite Peržiūra, tada pasirinkite Darbalaukis.
  2. Prisijunkite prie svetainės naudodami vartotojo abonementą, kuriam priskirtas anksčiau sukurtas serverio logikos vartotojo vaidmuo.
  3. Eikite į anksčiau sukurtą serverio logikos tinklalapį.

Serverio logikos apžvalga
Autoriaus serverio logika
Serverio objektai