<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[eDelivery Solutions Blog]]></title><description><![CDATA[eDelivery Solutions Blog]]></description><link>https://blog.edeliverysolutions.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1757693010804/e9b93be6-f363-4341-a31b-6101464ffd30.png</url><title>eDelivery Solutions Blog</title><link>https://blog.edeliverysolutions.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 05 May 2026 12:17:23 GMT</lastBuildDate><atom:link href="https://blog.edeliverysolutions.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Displaying ZohoBooks Data on Your Website using Oauth2 and .NetCore 8.0]]></title><description><![CDATA[Prerequisites

You already have a ZohoBooks account and Organization ID

You have your ZohoBooks OAuth2 Client ID and Client Secret

You have generated your ZohoBooks Grant Token

You have generated your ZohoBooks Refresh Token (and initial Access To...]]></description><link>https://blog.edeliverysolutions.com/displaying-zohobooks-data-on-your-website-using-oauth2-and-netcore-80</link><guid isPermaLink="true">https://blog.edeliverysolutions.com/displaying-zohobooks-data-on-your-website-using-oauth2-and-netcore-80</guid><category><![CDATA[.NET]]></category><category><![CDATA[OAuth2]]></category><category><![CDATA[zoho]]></category><category><![CDATA[C#]]></category><dc:creator><![CDATA[Mary Wagner]]></dc:creator><pubDate>Fri, 12 Sep 2025 17:19:41 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-prerequisites">Prerequisites</h2>
<ul>
<li><p>You already have a ZohoBooks account and Organization ID</p>
</li>
<li><p>You have your ZohoBooks OAuth2 Client ID and Client Secret</p>
</li>
<li><p>You have generated your ZohoBooks Grant Token</p>
</li>
<li><p>You have generated your ZohoBooks Refresh Token (and initial Access Token)</p>
</li>
<li><p>You are displaying the ZohoBooks data on your private (logged in) website, not a public website.</p>
</li>
</ul>
<h2 id="heading-create-and-populate-a-new-database-table-for-oauth2-token-values">Create and Populate a New Database Table for OAuth2 Token Values</h2>
<p>There will be only 1 record in this table. The ACCESSTOKENTIMESTAMP will be populated whenever the ACCESSTOKEN is updated. The ACCESSTOKENEXPIRATION will be used to determine if the current ACCESSTOKEN has expired, so that a new token is requested and obtained.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">"zohotokenstore"</span> (
    <span class="hljs-string">"ID"</span>    <span class="hljs-built_in">INTEGER</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">UNIQUE</span>,
    <span class="hljs-string">"ACCESSTOKEN"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"ACCESSTOKENTIMESTAMP"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"ACCESSTOKENEXPIRATION"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"ORGANIZATIONID"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"REFRESHTOKEN"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"CLIENTID"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"CLIENTSECRET"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"REDIRECTURL"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"APIBASEURL"</span>    <span class="hljs-built_in">TEXT</span>,
    <span class="hljs-string">"REFRESHTOKENBASEURL"</span>    <span class="hljs-built_in">TEXT</span>,
    PRIMARY <span class="hljs-keyword">KEY</span>(<span class="hljs-string">"ID"</span>)
)
</code></pre>
<h2 id="heading-create-token-store-model-class">Create Token Store Model Class</h2>
<p>The model class should have all of the above database columns defined within it. This model class will be referenced in the next step by the token store helper class.</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">using</span> System.ComponentModel.DataAnnotations;

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Ecd.Web.Models.Zoho</span>
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">TokenStore</span>
    {
        [<span class="hljs-meta">Key</span>]
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> ID { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? ACCESSTOKEN { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> DateTime ACCESSTOKENTIMESTAMP { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> DateTime ACCESSTOKENEXPIRATION { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? ORGANIZATIONID { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? REFRESHTOKEN { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? CLIENTID { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? CLIENTSECRET { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? REDIRECTURL { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? APIBASEURL { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span>? REFRESHTOKENBASEURL { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
    }
}
</code></pre>
<h2 id="heading-add-new-model-to-db-context-class">Add New Model to DB Context Class</h2>
<p>This will allow reference to it within other classes including the helper and controller classes.</p>
<pre><code class="lang-csharp">   <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">override</span> <span class="hljs-keyword">void</span> <span class="hljs-title">OnModelCreating</span>(<span class="hljs-params">ModelBuilder modelBuilder</span>)</span>
   {
      ......
       <span class="hljs-comment">//Zoho token store</span>
       modelBuilder.Entity&lt;Ecd.Web.Models.Zoho.TokenStore&gt;().ToTable(<span class="hljs-string">"zohotokenstore"</span>);
       ....
   }

<span class="hljs-string">''</span><span class="hljs-string">''</span>   
 <span class="hljs-keyword">public</span> DbSet&lt;Ecd.Web.Models.Zoho.TokenStore&gt; TokenStore { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
....
</code></pre>
<h2 id="heading-create-token-store-helper-class">Create Token Store Helper Class</h2>
<p>This helper will be called in the controller class that is retrieving data using the OAuth2 integration and generates a new access token with each call.</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">using</span> Ecd.Web.Data;
<span class="hljs-keyword">using</span> Ecd.Web.Models.Zoho;
<span class="hljs-keyword">using</span> RestSharp;
<span class="hljs-keyword">using</span> System.Text.Json;

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Ecd.Web.Helpers</span>
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ZohoTokenStoreHelper</span>
    {

      <span class="hljs-function"><span class="hljs-keyword">public</span> TokenStore <span class="hljs-title">getAccessToken</span>(<span class="hljs-params">MainDbContext _context</span>)</span>
        {
            <span class="hljs-keyword">var</span> grantType = <span class="hljs-string">"refresh_token"</span>;
            <span class="hljs-keyword">string</span> accessToken;

            <span class="hljs-keyword">var</span> model = <span class="hljs-keyword">new</span> TokenStore();
            model = _context.TokenStore.First(a =&gt; a.ID == <span class="hljs-number">1</span>);

            <span class="hljs-keyword">if</span> (DateTime.UtcNow &gt;= model.ACCESSTOKENEXPIRATION)
            {
                <span class="hljs-keyword">var</span> requestUrl = <span class="hljs-string">"/token?refresh_token="</span> + model.REFRESHTOKEN + <span class="hljs-string">"&amp;client_id="</span> + model.CLIENTID + <span class="hljs-string">"&amp;client_secret="</span> + model.CLIENTSECRET + <span class="hljs-string">"&amp;redirect_uri="</span> + model.REDIRECTURL + <span class="hljs-string">"&amp;grant_type="</span> + grantType;
                <span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> RestClient(<span class="hljs-string">"https://accounts.zoho.com/oauth/v2"</span>); <span class="hljs-comment">// Zoho Books API base URL</span>
                <span class="hljs-keyword">var</span> request = <span class="hljs-keyword">new</span> RestRequest(requestUrl, Method.Post); <span class="hljs-comment">// Specify the endpoint and HTTP method</span>

                request.AddHeader(<span class="hljs-string">"Content-Type"</span>, <span class="hljs-string">"application/data"</span>); <span class="hljs-comment">// Add authorization header with the access token</span>
                <span class="hljs-keyword">var</span> response = client.Execute(request);

                <span class="hljs-keyword">using</span> (JsonDocument document = JsonDocument.Parse(response.Content))
                {
                    JsonElement root = document.RootElement;
                    accessToken = <span class="hljs-string">"Zoho-oauthtoken "</span> + root.GetProperty(<span class="hljs-string">"access_token"</span>).GetString();
                    Console.WriteLine(<span class="hljs-string">$"access_token: <span class="hljs-subst">{accessToken}</span>"</span>);
                }

                model.ACCESSTOKEN = accessToken;
                model.ACCESSTOKENTIMESTAMP = DateTime.UtcNow;
                model.ACCESSTOKENEXPIRATION = model.ACCESSTOKENTIMESTAMP.AddSeconds(<span class="hljs-number">3600</span>);
                ;
                _context.Update(model);
                _context.SaveChangesAsync();

                Console.WriteLine(response.Content);
            }  

                <span class="hljs-keyword">return</span> model;                           
        }
    }
}
</code></pre>
<h2 id="heading-create-controller-class-to-pass-zoho-item-list-to-view">Create Controller Class to Pass Zoho Item List to View</h2>
<p>This helper will be called in all of the controller class that is retrieving data using the OAuth2 integration and generates a new access token with each call.</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">using</span> Microsoft.AspNetCore.Mvc;
<span class="hljs-keyword">using</span> Microsoft.AspNetCore.Authorization;
<span class="hljs-keyword">using</span> RestSharp;
<span class="hljs-keyword">using</span> Newtonsoft.Json;
<span class="hljs-keyword">using</span> Ecd.Web.Data;
<span class="hljs-keyword">using</span> Ecd.Web.Models.Zoho;
<span class="hljs-keyword">using</span> Ecd.Web.Helpers;
<span class="hljs-keyword">using</span> System.Text.Json.Nodes;
<span class="hljs-keyword">using</span> System.Text.Json;
<span class="hljs-keyword">using</span> System.Text;

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Ecd.Web.Controllers</span>
{
    [<span class="hljs-meta">Authorize</span>]
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ZohoItemsController</span> : <span class="hljs-title">Controller</span>
    {
        <span class="hljs-keyword">private</span> <span class="hljs-keyword">readonly</span> MainDbContext _context;
        <span class="hljs-keyword">private</span> <span class="hljs-keyword">readonly</span> IHttpContextAccessor _httpContextAccessor;

        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ZohoItemsController</span>(<span class="hljs-params">MainDbContext context, IHttpContextAccessor httpContextAccessor</span>)</span>
        {
            _context = context;
            _httpContextAccessor = httpContextAccessor;
        }

        <span class="hljs-function"><span class="hljs-keyword">public</span> IActionResult <span class="hljs-title">Index</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> itemName</span>)</span>
        {
            <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">string</span>.IsNullOrWhiteSpace(itemName))
            {
                ViewData[<span class="hljs-string">"filter"</span>] = itemName;
            }

            <span class="hljs-keyword">return</span> View();
        }

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">async</span> Task&lt;IActionResult&gt; <span class="hljs-title">LoadData</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> itemName, <span class="hljs-keyword">int</span> totalPages, <span class="hljs-keyword">int</span> currentPage = <span class="hljs-number">1</span></span>)</span>
{
    <span class="hljs-keyword">var</span> tokenHelper = <span class="hljs-keyword">new</span> ZohoTokenStoreHelper();
    <span class="hljs-keyword">var</span> tokenStore = tokenHelper.getAccessToken(_context);
    <span class="hljs-keyword">var</span> access_token = tokenStore.ACCESSTOKEN;
    <span class="hljs-keyword">var</span> organization_id = tokenStore.ORGANIZATIONID;
    <span class="hljs-keyword">string</span> url_page_context;
    <span class="hljs-keyword">string</span> url_data;

    <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">string</span>.IsNullOrWhiteSpace(itemName))
    {
        url_page_context = <span class="hljs-string">"/items?organization_id="</span> + organization_id + <span class="hljs-string">"&amp;status=active&amp;name_contains="</span> + itemName + <span class="hljs-string">"&amp;response_option=2"</span>;
        url_data = <span class="hljs-string">"https://www.zohoapis.com/books/v3/items?organization_id="</span> + organization_id + <span class="hljs-string">"&amp;status=active&amp;name_contains="</span> + itemName + <span class="hljs-string">"&amp;page="</span>;
    }
    <span class="hljs-keyword">else</span>
    {
        url_page_context = <span class="hljs-string">"/items?organization_id="</span> + organization_id + <span class="hljs-string">"&amp;status=active&amp;response_option=2"</span>;
        url_data = <span class="hljs-string">"https://www.zohoapis.com/books/v3/items?organization_id="</span> + organization_id + <span class="hljs-string">"&amp;status=active&amp;page="</span>;
    }

    Console.WriteLine(<span class="hljs-string">$"itemName: <span class="hljs-subst">{itemName}</span>"</span>);
    Console.WriteLine(<span class="hljs-string">$"url_page_context: <span class="hljs-subst">{url_page_context}</span>"</span>);
    Console.WriteLine(<span class="hljs-string">$"url_data: <span class="hljs-subst">{url_data}</span>"</span>);

    JsonNode jsonObject;
    JsonArray? jsonArray;

    Console.WriteLine(<span class="hljs-string">$"tokenStore: <span class="hljs-subst">{tokenStore}</span>"</span>);
    Console.WriteLine(<span class="hljs-string">$"access_token: <span class="hljs-subst">{access_token}</span>"</span>);
    Console.WriteLine(<span class="hljs-string">$"organization_id: <span class="hljs-subst">{organization_id}</span>"</span>);

    <span class="hljs-comment"><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>/GET TOTAL PAGE COUNT<span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>//</span>
    <span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> RestClient(<span class="hljs-string">"https://www.zohoapis.com/books/v3"</span>); <span class="hljs-comment">// Zoho Books API base URL</span>
                                                                      <span class="hljs-comment">// var request = new RestRequest("/items?organization_id=" + organization_id + "&amp;status=active&amp;name_contains="+ itemName + "&amp;response_option=2", Method.Get); // Specify the endpoint and HTTP method</span>
    <span class="hljs-keyword">var</span> request = <span class="hljs-keyword">new</span> RestRequest(url_page_context, Method.Get); <span class="hljs-comment">// Specify the endpoint and HTTP method</span>

    Console.WriteLine(<span class="hljs-string">$"request: <span class="hljs-subst">{request}</span>"</span>);

    request.AddHeader(<span class="hljs-string">"Authorization"</span>, access_token);
    request.AddHeader(<span class="hljs-string">"Content-Type"</span>, <span class="hljs-string">"application/json"</span>);

    <span class="hljs-keyword">var</span> response = client.Execute(request);

    <span class="hljs-keyword">dynamic</span> responseData = JsonConvert.DeserializeObject(response.Content);
    totalPages = responseData.page_context.total_pages;

    Console.WriteLine(<span class="hljs-string">$"response option 2 data: <span class="hljs-subst">{responseData}</span>"</span>);
    Console.WriteLine(<span class="hljs-string">$"totalPages: <span class="hljs-subst">{totalPages}</span>"</span>);

    <span class="hljs-comment"><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>/GET FIRST PAGE DATA<span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>//</span>
    <span class="hljs-keyword">using</span> (<span class="hljs-keyword">var</span> httpClient = <span class="hljs-keyword">new</span> HttpClient())
    {
        <span class="hljs-keyword">var</span> httpRequest = <span class="hljs-keyword">new</span> HttpRequestMessage(HttpMethod.Get, url_data + currentPage);

        Console.WriteLine(<span class="hljs-string">$"httpRequest: <span class="hljs-subst">{httpRequest}</span>"</span>);

        httpRequest.Headers.Add(<span class="hljs-string">"Authorization"</span>, access_token);

        <span class="hljs-keyword">var</span> httpResponse = <span class="hljs-keyword">await</span> httpClient.SendAsync(httpRequest);
        <span class="hljs-keyword">string</span> content = <span class="hljs-keyword">await</span> httpResponse.Content.ReadAsStringAsync();

        JsonNode jsonObject1 = JsonObject.Parse(content)[<span class="hljs-string">"items"</span>];
        JsonArray? jsonArray1 = jsonObject1?.AsArray();

        <span class="hljs-comment"><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>/GET REMAINING PAGES DATA<span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>/</span>
        <span class="hljs-keyword">while</span> (currentPage &lt; totalPages)
        {
            currentPage = currentPage + <span class="hljs-number">1</span>;

            <span class="hljs-comment">//  httpClient = new HttpClient();</span>
            httpRequest = <span class="hljs-keyword">new</span> HttpRequestMessage(HttpMethod.Get, url_data + <span class="hljs-string">"&amp;page="</span> + currentPage);

            httpRequest.Headers.Add(<span class="hljs-string">"Authorization"</span>, access_token);
            httpResponse = <span class="hljs-keyword">await</span> httpClient.SendAsync(httpRequest);
            content = <span class="hljs-keyword">await</span> httpResponse.Content.ReadAsStringAsync();

            jsonObject = JsonObject.Parse(content)[<span class="hljs-string">"items"</span>];
            jsonArray = jsonObject?.AsArray();

            <span class="hljs-comment"><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span>/ADD NEXT PAGE DATA TO FIRST PAGE DATA<span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span><span class="hljs-doctag">///</span></span>
            <span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> element <span class="hljs-keyword">in</span> jsonArray)
            {
                jsonArray1.Add(element?.DeepClone()); <span class="hljs-comment">// DeepClone to avoid parent issues                                                            </span>
            }
        }

        <span class="hljs-keyword">return</span> Json(<span class="hljs-keyword">new</span> { data = jsonArray1 });
    }
}  
    }
}
</code></pre>
<h2 id="heading-create-view-to-display-the-zoho-item-list">Create View to Display the Zoho Item List</h2>
<p>The view will display the listing of Zoho Items using datatables. I have included several datatables style and jscript file references below, which normally are in my layout page.</p>
<pre><code class="lang-csharp">@{
    ViewData[<span class="hljs-string">"Title"</span>] = <span class="hljs-string">"Zoho Items"</span>;
    Layout = <span class="hljs-string">"_Layout_logged_in"</span>;
}
&lt;!-- Datatables --&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/2.0.3/css/dataTables.bootstrap4.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/2.0.3/css/dataTables.dataTables.min.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/autofill/2.7.0/css/autoFill.dataTables.min.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/buttons/3.0.1/css/buttons.dataTables.min.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/colreorder/2.0.0/css/colReorder.dataTables.min.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;
&lt;link href=<span class="hljs-string">"https://cdn.datatables.net/select/2.0.0/css/select.dataTables.min.css"</span> rel=<span class="hljs-string">"stylesheet"</span> type=<span class="hljs-string">"text/css"</span> /&gt;

&lt;!-- For the DataTables grid current version--&gt;
&lt;script src=<span class="hljs-string">"https://code.jquery.com/jquery-3.7.1.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.bundle.min.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdn.datatables.net/2.0.3/js/dataTables.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdn.datatables.net/2.0.3/js/dataTables.bootstrap4.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdnjs.cloudflare.com/ajax/libs/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.min.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdn.datatables.net/select/2.0.0/js/dataTables.select.min.js"</span>&gt;&lt;/script&gt;
&lt;script src=<span class="hljs-string">"https://cdn.datatables.net/buttons/3.0.1/js/dataTables.buttons.min.js"</span>&gt;&lt;/script&gt;

&lt;br /&gt;

&lt;div id=<span class="hljs-string">"container"</span>&gt;
    &lt;div&gt;
        &lt;h3&gt;Zoho Books Items&lt;/h3&gt;

    &lt;/div&gt;

    &lt;table id=<span class="hljs-string">"itemsTable"</span> <span class="hljs-keyword">class</span>=<span class="hljs-string">"table table-striped table-condensed table-bordered data-tables responsive"</span> style=<span class="hljs-string">"width:100%"</span>&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;ITEMID&lt;/th&gt;
                &lt;th&gt;SKU&lt;/th&gt;
                &lt;th&gt;NAME&lt;/th&gt;
                &lt;th&gt;SALESDESCRIPTION&lt;/th&gt;
                &lt;th&gt;PURCHASEDESCRIPTION&lt;/th&gt;
                &lt;th&gt;SALESRATE&lt;/th&gt;
                &lt;th&gt;PURCHASERATE&lt;/th&gt;
                &lt;th&gt;SOH&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
    &lt;/table&gt;
&lt;/div&gt;

&lt;<span class="hljs-keyword">partial</span> name=<span class="hljs-string">"editSalesRate"</span> /&gt;

&lt;script&gt;
    $(document).ready(function () {

        <span class="hljs-keyword">var</span> itemsTable;
        <span class="hljs-keyword">var</span> successMessage = <span class="hljs-string">"The database has been updated successfully!"</span>;
        <span class="hljs-keyword">var</span> url = <span class="hljs-string">"/ZohoItems/LoadData"</span>;

        itemsTable = $(<span class="hljs-string">'#itemsTable'</span>).DataTable({
            dom: <span class="hljs-string">'Bpflrtipl'</span>,
            retrieve: <span class="hljs-literal">true</span>,
            processing: <span class="hljs-literal">true</span>, <span class="hljs-comment">// for show progress bar</span>
            language: { processing: <span class="hljs-string">"&lt;font style=color:#fa5729;font-weight:bold;font-size:x-large;&gt;PROCESSING....&lt;/font&gt;"</span> },
            <span class="hljs-comment">//serverSide: true, // for process server side</span>
            filter: <span class="hljs-literal">true</span>, <span class="hljs-comment">// this is for disable filter (search box)</span>
            ajax: {
                url: url,
                type: <span class="hljs-string">"POST"</span>,
                datatype: <span class="hljs-string">"json"</span>
            },          
            columns: [
                { data: <span class="hljs-string">"item_id"</span>, name: <span class="hljs-string">"item_id"</span>, autoWidth: <span class="hljs-literal">true</span>, visible: <span class="hljs-literal">false</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"sku"</span>, name: <span class="hljs-string">"sku"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"name"</span>, name: <span class="hljs-string">"name"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"description"</span>, name: <span class="hljs-string">"description"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"purchase_description"</span>, name: <span class="hljs-string">"purchase_description"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"rate"</span>, name: <span class="hljs-string">"rate"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"purchase_rate"</span>, name: <span class="hljs-string">"purchase_rate"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-string">"---"</span> },
                { data: <span class="hljs-string">"available_stock"</span>, name: <span class="hljs-string">"available_stock"</span>, autoWidth: <span class="hljs-literal">true</span>, <span class="hljs-string">"defaultContent"</span>: <span class="hljs-number">0</span> }
            ]
        });
    });

&lt;/script&gt;
</code></pre>
<h2 id="heading-sample-website-display">Sample Website Display</h2>
<p>/<strong>ZohoItems/Index</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757697375316/639c157c-322d-4873-abe2-2ee7060b3aa6.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item></channel></rss>