Kuidas: Dataverse'i tabelitega suhtlemine serveriloogika abil

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

  1. Logige sisse Power Pages'i.

  2. Valige sait + redigeerimine.

  3. Liikuge tööruumi Häälestamine ja seejärel valige Serveri loogika (eelvaade).

  4. Valige +Uus serveriloogika.

  5. Sisestage serveri loogika nimi. Seda nime kasutatakse API-s ressursi identifikaatorina serveri loogika API loomisel.

    Näide: dataverse-crud-operations

  6. Sobiva veebirolli määramiseks valige +Lisa rollid .

  7. Valige nime kõrval 3 punkti (...) ja valige Redigeeri koodi.

  8. Kohandatud loogika loomiseks valige Ava Visual Studio Code . Failist leiate eelmääratletud meetodid ja skriptid.

  9. 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);
    
  10. Salvestage fail.

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

  1. Käivitage Power Pages'i kujundusstuudio.

  2. Valige tööruumis Lehed + Leht.

  3. Sisestage dialoogiboksis Lehe lisamine väljale Nimi tekst Serveri loogika ja valige Alusta tühjast paigutusest.

  4. Valige suvand Lisa.

  5. Valige paremas ülanurgas suvand Muuda koodi .

  6. Valige Ava Visual Studio Code.

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

  1. Käivitage rakendus Portaalihaldus.
  2. Valige vasakpoolsel paanil jaotises Turvalisus suvand Veebirollid.
  3. Tehke valik Uus.
  4. Sisestage väljale NimiServeriloogika kasutaja (või mis tahes nimi, mis kajastab kõige paremini seda funktsiooni kasutava kasutaja rolli).
  5. Valige loendist Veebisait oma veebisaidi kirje.
  6. Valige käsk Salvesta.

Tabeli õiguste loomine

  1. Käivitage Power Pages'i kujundusstuudio.
  2. Valige tööruum Turvalisus .
  3. Valige jaotises Kaitse suvand Tabeliõigused.
  4. Valige Uus luba.
  5. Sisestage väljale Nimi tekst Kontaktitabeli õigus.
  6. Valige loendist Tabeli nimiKontakt (kontakt).
  7. Valige loendist Juurdepääsu tüüpväärtus Globaalne.
  8. Valige Lugemis-, Kirjuta-, Loo- ja Kustutamisõigused .
  9. Valige + Lisa rollid ja valige varem valitud või loodud veebiroll .
  10. Valige Salvesta & Sule.

Kontaktide lisamine veebirolli

  1. Käivitage rakendus Portaalihaldus.
  2. Valige vasakpoolsel paanil jaotises Turvalisus suvand Kontaktid.
  3. 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.

  4. Valige Seotud>veebirollid.
  5. Valige Lisa olemasolev veebiroll.
  6. Valige varem loodud kasutajaroll Serveri loogika .
  7. Valige suvand Lisa.
  8. Valige Salvesta & Sule.

4. etapp: serveriloogika kasutamine lugemiseks, vaatamiseks, redigeerimiseks, loomiseks ja kustutamiseks

Veebi API funktsionaalsuse testimiseks tehke järgmist.

  1. Valige Eelvaade ja seejärel valige Töölaud.
  2. Logige saidile sisse kasutajakontoga, millele on määratud varem loodud kasutajaroll Serveri loogika .
  3. Minge varem loodud serveriloogika veebilehele.

Serveri loogika ülevaade
Autori serveri loogika
Serveri objektid