{"id":1460,"date":"2015-03-31T21:33:46","date_gmt":"2015-04-01T01:33:46","guid":{"rendered":"http:\/\/andrewpallant.ca\/wordpress\/?p=1460"},"modified":"2015-03-31T21:41:40","modified_gmt":"2015-04-01T01:41:40","slug":"the-story-of-c-meeting-angularjs","status":"publish","type":"post","link":"http:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/","title":{"rendered":"The Story of C# Meeting AngularJS"},"content":{"rendered":"<p>Most of you already know that I still like my WebForms. People have argued that using AngularJS with WebForms is pointless, but I say NA! It makes the user experience a little bit smoother.<\/p>\n<p>In this blog I will show you how to create a table that can be sorted and paged using AngularJS. I chose not to use a webserivce as I did not feel like this warranted the extra overhead and code. I wanted to keep this absolutely simple. I would have used a webserivce had I been creating an API for others to use. This is also a project that is ultimately using WebForms, had I been doing an MVC project; webservices would have been a better choice.<\/p>\n<p>Is this the best way; probably not! This is my first run with this, so I am doing it the way I know and the way I find the easiest to manipulate for my purpose.<br \/>\n<!--more--><br \/>\nThis is a simple example that most people would know. How to build a data string to be used in our AngularJS controller. There is nothing of rocket science here, but it is required to show the first piece of the puzzle.<\/p>\n<pre style=\"font-family: arial; font-size: 12px; border: 1px dashed #CCCCCC; width: 99%; height: auto; overflow: auto; background: #f0f0f0; padding: 0px; color: #000000; text-align: left; line-height: 20px;\"><code style=\"color: #000000; word-wrap: normal;\">       SqlDataReader rdr = cmd.ExecuteReader();  \r\n       data = \"[\";  \r\n       while (rdr.Read())  \r\n       {  \r\n         if (data.Length &gt; 1) data += \",\\n\";  \r\n         data += \"{\";  \r\n         data += String.Format(\"FirstName:'{0}', LastName:'{1}', Email:'{2}', id:'{3}'\", rdr[\"first_name\"], rdr[\"last_name\"], rdr[\"email\"], rdr[\"id\"]);  \r\n         data += \"}\";  \r\n       }  \r\n       data += \"]\";  \r\n<\/code><\/pre>\n<p>This is a pretty common way to render dynamic data&#8230; I create an ASPX form page with absolutely no content. No tags at all. All that remains is the Page tag that links the code behind. I do this for images, PDF, CSV files and more. The code behind is what does the grunt work. It creates the output and pushes it through the response object. Effectively we cancel the default headers and create new headers telling the browser that we are now a different file type. In this case a plain\/text file. The browser will see this as a JavaScript file based on our HTML implementation later in this blog.<\/p>\n<pre style=\"font-family: arial; font-size: 12px; border: 1px dashed #CCCCCC; width: 99%; height: auto; overflow: auto; background: #f0f0f0; padding: 0px; color: #000000; text-align: left; line-height: 20px;\"><code style=\"color: #000000; word-wrap: normal;\">   public partial class TableData : System.Web.UI.Page  \r\n   {  \r\n     protected void Page_Load(object sender, EventArgs e)  \r\n     {  \r\n       String data = U_University.Lib.User.GetAllUsersData();  \r\n       String script = @\"  \r\n   var app = angular.module('users', ['ngTable']).  \r\n   controller('UsersController', function ($scope, $filter, NgTableParams) {  \r\n     data=\" + data + @\";  \r\n       $scope.tableParams = new NgTableParams({  \r\n         page: 1,      \/\/ show first page  \r\n         count: 10,     \/\/ count per page  \r\n         sorting: {  \r\n           name: 'asc'   \/\/ initial sorting  \r\n         }  \r\n       }, {  \r\n         total: data.length, \/\/ length of data  \r\n         getData: function($defer, params) {  \r\n           \/\/ use build-in angular filter  \r\n           var orderedData = params.sorting() ?  \r\n                     $filter('orderBy')(data, params.orderBy()) :  \r\n                     data;  \r\n           $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));  \r\n         }  \r\n       });  \r\n     })\";  \r\n       Response.ClearHeaders();  \r\n       Response.ClearContent();  \r\n       Response.ContentType = \"text\/plain\";  \r\n       Response.Output.Write(script);  \r\n     }  \r\n   }  \r\n<\/code><\/pre>\n<p>In the header of my HTML file, I establish my includes. All of the &#8220;.js&#8221; can easily be found with a Google search. You need the angular.js, ng-table.js and the ng-table.css files for this example. The key to my controller and its data is within the following tag:<\/p>\n<p>&lt;script src=&#8221;TableData.aspx&#8221; type=&#8221;text\/javascript&#8221;&gt;&lt;\/script&gt;<\/p>\n<p>This tag is referencing my empty page the hijacks the response object and outputs my controller containing my dynamic data.<\/p>\n<pre style=\"font-family: arial; font-size: 12px; border: 1px dashed #CCCCCC; width: 99%; height: auto; overflow: auto; background: #f0f0f0; padding: 0px; color: #000000; text-align: left; line-height: 20px;\"><code style=\"color: #000000; word-wrap: normal;\">   &lt;script src=\"\/js\/angular.js\" type=\"text\/javascript\"&gt;&lt;\/script&gt;  \r\n   &lt;script src=\"\/js\/angular-sanitize.js\" type=\"text\/javascript\"&gt;&lt;\/script&gt;  \r\n   &lt;script src=\"\/js\/ng-table.js\" type=\"text\/javascript\"&gt;&lt;\/script&gt;  \r\n   &lt;script src=\"TableData.aspx\" type=\"text\/javascript\"&gt;&lt;\/script&gt;  \r\n   &lt;link href=\"\/css\/ng-table.css\" rel=\"stylesheet\" type=\"text\/css\" \/&gt;  \r\n<\/code><\/pre>\n<p>Now to setup my table. I am using the ng-table.js library. This allows me to create a sortable and pageable table fairly easily. There is really nothing too fancy, just some additional attributes (data-title, sortable). Everything else in the table is standard HTML\/AngularJS.<\/p>\n<pre style=\"font-family: arial; font-size: 12px; border: 1px dashed #CCCCCC; width: 99%; height: auto; overflow: auto; background: #f0f0f0; padding: 0px; color: #000000; text-align: left; line-height: 20px;\"><code style=\"color: #000000; word-wrap: normal;\"> &lt;div ng-app=\"users\" ng-controller=\"UsersController\"&gt;  \r\n   &lt;div class=\"text-center\"&gt;&lt;h1&gt;User Manager&lt;\/h1&gt;&lt;\/div&gt;  \r\n   &lt;form id=\"frmMain\" runat=\"server\"&gt;  \r\n     &lt;div class=\"text-right\"&gt;&lt;asp:LinkButton runat=\"server\" ID=\"lnkNew\"&gt;New User&lt;\/asp:LinkButton&gt;&lt;\/div&gt;  \r\n     &lt;table ng-table=\"tableParams\" class=\"table\"&gt;  \r\n       &lt;tr ng-repeat=\"user in $data\"&gt;  \r\n         &lt;td data-title=\"'First Name'\" sortable=\"'FirstName'\"&gt;&lt;a href=\"AddEdit.aspx?id={{user.id}}\"&gt;{{user.FirstName}}&lt;\/a&gt;&lt;\/td&gt;  \r\n         &lt;td data-title=\"'Last Name'\" sortable=\"'LastName'\"&gt;{{user.LastName}}&lt;\/td&gt;  \r\n         &lt;td data-title=\"'Email'\" sortable=\"'Email'\"&gt;{{user.Email}}&lt;\/td&gt;  \r\n       &lt;\/tr&gt;  \r\n     &lt;\/table&gt;  \r\n   &lt;\/form&gt;  \r\n &lt;\/div&gt;  \r\n<\/code><\/pre>\n<p>VOILA! We now have a sortable, pageable table &#8211; and it looks pretty as well!<\/p>\n<div class=\"grid_12\">\n<img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1466\" src=\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\" alt=\"sortableTable\" width=\"676\" height=\"235\" srcset=\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png 676w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-300x104.png 300w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-100x35.png 100w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-150x52.png 150w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-200x70.png 200w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-450x156.png 450w, http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable-600x209.png 600w\" sizes=\"(max-width: 676px) 100vw, 676px\" \/>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Most of you already know that I still like my WebForms. People have argued that using AngularJS with WebForms is pointless, but I say NA! It makes the user experience a little bit smoother. In this blog I will show you how to create a table that can be sorted and paged using AngularJS. I &hellip; <a href=\"http:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">The Story of C# Meeting AngularJS<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[232,13,141,25,36,96],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\r\n<title>The Story of C# Meeting AngularJS - Software Developer In London<\/title>\r\n<meta name=\"description\" content=\"Sortable AngularJS Table - My way; probably not the best way, but it works!\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"The Story of C# Meeting AngularJS - Software Developer In London\" \/>\r\n<meta property=\"og:description\" content=\"Sortable AngularJS Table - My way; probably not the best way, but it works!\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\" \/>\r\n<meta property=\"og:site_name\" content=\"LDNDeveloper\" \/>\r\n<meta property=\"article:published_time\" content=\"2015-04-01T01:33:46+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2015-04-01T01:41:40+00:00\" \/>\r\n<meta property=\"og:image\" content=\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\" \/>\r\n<meta name=\"author\" content=\"ldnDeveloper\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:creator\" content=\"@LdnDeveloper\" \/>\r\n<meta name=\"twitter:site\" content=\"@LdnDeveloper\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"ldnDeveloper\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\"},\"author\":{\"name\":\"ldnDeveloper\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84\"},\"headline\":\"The Story of C# Meeting AngularJS\",\"datePublished\":\"2015-04-01T01:33:46+00:00\",\"dateModified\":\"2015-04-01T01:41:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\"},\"wordCount\":459,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84\"},\"image\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\",\"articleSection\":[\"AngularJS\",\"C#\",\"Developement\",\"DotNet\",\"How To\",\"Web\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\",\"url\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\",\"name\":\"The Story of C# Meeting AngularJS - Software Developer In London\",\"isPartOf\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\",\"datePublished\":\"2015-04-01T01:33:46+00:00\",\"dateModified\":\"2015-04-01T01:41:40+00:00\",\"description\":\"Sortable AngularJS Table - My way; probably not the best way, but it works!\",\"breadcrumb\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage\",\"url\":\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\",\"contentUrl\":\"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png\",\"width\":676,\"height\":235},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/andrewpallant.ca\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Story of C# Meeting AngularJS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#website\",\"url\":\"https:\/\/andrewpallant.ca\/wordpress\/\",\"name\":\"LDNDeveloper\",\"description\":\"Learning, Growing and Sharing.\",\"publisher\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/andrewpallant.ca\/wordpress\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84\",\"name\":\"ldnDeveloper\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2017\/05\/cropped-AAEAAQAAAAAAAAXQAAAAJDQxMGRlMzFjLWM4ODctNDk1NC05M2EyLWE1NDNhNTRiZjVlYw-2.jpg\",\"contentUrl\":\"https:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2017\/05\/cropped-AAEAAQAAAAAAAAXQAAAAJDQxMGRlMzFjLWM4ODctNDk1NC05M2EyLWE1NDNhNTRiZjVlYw-2.jpg\",\"width\":512,\"height\":512,\"caption\":\"ldnDeveloper\"},\"logo\":{\"@id\":\"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/image\/\"},\"description\":\"Andrew Pallant (@LdnDeveloper) has been a web, database and desktop developer for over 16 years. Andrew has worked on projects that ranged from factory automation to writing business applications. Most recently he has been heavily involved in various forms for ecommerce projects. Over the years Andrew has worn many hats: Project Manager, IT Manager, Lead Developer, Supervisor of Developers and many more - See more at: http:\/\/www.unlatched.com\/#sthash.8DiTkpKy.dpuf\",\"sameAs\":[\"http:\/\/www.andrewpallant.ca\",\"https:\/\/x.com\/LdnDeveloper\"],\"url\":\"http:\/\/andrewpallant.ca\/wordpress\/author\/ldndeveloper\/\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Story of C# Meeting AngularJS - Software Developer In London","description":"Sortable AngularJS Table - My way; probably not the best way, but it works!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/","og_locale":"en_US","og_type":"article","og_title":"The Story of C# Meeting AngularJS - Software Developer In London","og_description":"Sortable AngularJS Table - My way; probably not the best way, but it works!","og_url":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/","og_site_name":"LDNDeveloper","article_published_time":"2015-04-01T01:33:46+00:00","article_modified_time":"2015-04-01T01:41:40+00:00","og_image":[{"url":"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png"}],"author":"ldnDeveloper","twitter_card":"summary_large_image","twitter_creator":"@LdnDeveloper","twitter_site":"@LdnDeveloper","twitter_misc":{"Written by":"ldnDeveloper","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#article","isPartOf":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/"},"author":{"name":"ldnDeveloper","@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84"},"headline":"The Story of C# Meeting AngularJS","datePublished":"2015-04-01T01:33:46+00:00","dateModified":"2015-04-01T01:41:40+00:00","mainEntityOfPage":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/"},"wordCount":459,"commentCount":0,"publisher":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84"},"image":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage"},"thumbnailUrl":"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png","articleSection":["AngularJS","C#","Developement","DotNet","How To","Web"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/","url":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/","name":"The Story of C# Meeting AngularJS - Software Developer In London","isPartOf":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage"},"image":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage"},"thumbnailUrl":"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png","datePublished":"2015-04-01T01:33:46+00:00","dateModified":"2015-04-01T01:41:40+00:00","description":"Sortable AngularJS Table - My way; probably not the best way, but it works!","breadcrumb":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#primaryimage","url":"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png","contentUrl":"http:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2015\/03\/sortableTable.png","width":676,"height":235},{"@type":"BreadcrumbList","@id":"https:\/\/andrewpallant.ca\/wordpress\/the-story-of-c-meeting-angularjs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/andrewpallant.ca\/wordpress\/"},{"@type":"ListItem","position":2,"name":"The Story of C# Meeting AngularJS"}]},{"@type":"WebSite","@id":"https:\/\/andrewpallant.ca\/wordpress\/#website","url":"https:\/\/andrewpallant.ca\/wordpress\/","name":"LDNDeveloper","description":"Learning, Growing and Sharing.","publisher":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/andrewpallant.ca\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/f6f5bb1ac3e0c5a54a8b5ce35fd67b84","name":"ldnDeveloper","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2017\/05\/cropped-AAEAAQAAAAAAAAXQAAAAJDQxMGRlMzFjLWM4ODctNDk1NC05M2EyLWE1NDNhNTRiZjVlYw-2.jpg","contentUrl":"https:\/\/andrewpallant.ca\/wordpress\/wp-content\/uploads\/2017\/05\/cropped-AAEAAQAAAAAAAAXQAAAAJDQxMGRlMzFjLWM4ODctNDk1NC05M2EyLWE1NDNhNTRiZjVlYw-2.jpg","width":512,"height":512,"caption":"ldnDeveloper"},"logo":{"@id":"https:\/\/andrewpallant.ca\/wordpress\/#\/schema\/person\/image\/"},"description":"Andrew Pallant (@LdnDeveloper) has been a web, database and desktop developer for over 16 years. Andrew has worked on projects that ranged from factory automation to writing business applications. Most recently he has been heavily involved in various forms for ecommerce projects. Over the years Andrew has worn many hats: Project Manager, IT Manager, Lead Developer, Supervisor of Developers and many more - See more at: http:\/\/www.unlatched.com\/#sthash.8DiTkpKy.dpuf","sameAs":["http:\/\/www.andrewpallant.ca","https:\/\/x.com\/LdnDeveloper"],"url":"http:\/\/andrewpallant.ca\/wordpress\/author\/ldndeveloper\/"}]}},"_links":{"self":[{"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/posts\/1460"}],"collection":[{"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/comments?post=1460"}],"version-history":[{"count":14,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/posts\/1460\/revisions"}],"predecessor-version":[{"id":1475,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/posts\/1460\/revisions\/1475"}],"wp:attachment":[{"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/media?parent=1460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/categories?post=1460"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/andrewpallant.ca\/wordpress\/wp-json\/wp\/v2\/tags?post=1460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}