{"id":2250,"date":"2014-05-14T12:00:21","date_gmt":"2014-05-14T08:00:21","guid":{"rendered":"http:\/\/www.dhtmlx.com\/blog\/?p=2250"},"modified":"2026-06-12T17:53:29","modified_gmt":"2026-06-12T14:53:29","slug":"using-dhtmlx-gantt-chart-asp-net-mvc","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/using-dhtmlx-gantt-chart-asp-net-mvc\/","title":{"rendered":"Gantt Chart for ASP.NET MVC with dhtmlxGantt"},"content":{"rendered":"<p><strong>We have an updated tutorial of <a href=\"\/\/dhtmlx.com\/blog\/using-dhtmlx-gantt-chart-asp-net-rest-api\/\">how to use dhtmlxGantt with ASP.NET on the server side<\/a>. Unlike this guide, we use REST API so that the code appears far more simple.<\/strong><\/p>\n<p>The Gantt component is available in both free and paid editions. The free <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/open-source\/\" rel=\"noopener\" target=\"_blank\">Community Edition<\/a> is distributed under the MIT license, which allows using the core Gantt functionality in commercial and open-source projects. The PRO Edition comes with a powerful pack of advanced features and professional tech support offered under commercial DHTMLX licenses.<\/p>\n<p>This tutorial will lead you through the steps required to integrate dhtmlxGantt into an ASP.NET MVC application. We will learn how to put this Ajax-based Gantt chart on a web page, load tasks from the .NET server side, and update them in the database when a user makes changes in the browser.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2279\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-asp-net.png\" alt=\"Gantt Chart for ASP.NET MVC - Demo\" width=\"600\" height=\"255\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-asp-net.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-asp-net-300x127.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>If you are familiar with ASP.NET MVC and dhtmlxGantt and you just want to dive into the code, <b><a title=\"dhtmlxGantt with ASP.NET MVC Demo\" href=\"https:\/\/dhtmlx.com\/x\/download\/regular\/demos\/gantt-mvc-sample.zip\">download the final demo app<\/a><\/b>.<\/p>\n<p>NOTE: The sample goes without pre-downloaded NuGet packages. They will be installed automatically when you Build the project in Visual Studio. If it doesn&#8217;t happen, you can either configure Visual Studio to <a title=\"restore NuGet packages\" href=\"https:\/\/learn.microsoft.com\/ru-ru\/nuget\/consume-packages\/package-restore\" target=\"_blank\">restore missing packages during the build<\/a>, or install them manually by this command in Package Manager Console:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">Update-Package-Reinstall<\/div><\/div>\n<p><a href=\"\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3693\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner.png\" alt=\"download gantt\" width=\"900\" height=\"300\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner.png 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner-300x100.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner-768x256.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p>If you need the detailed instructions on how to use dhtmlxGantt with ASP.NET MVC, keep reading the tutorial.<\/p>\n<h3>Getting Started<\/h3>\n<p>First of all, you need to create a new MVC project.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2254\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-2.png\" alt=\"dhtmlxGantt with ASP.NET MVC - Creating a Project\" width=\"600\" height=\"420\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-2.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-2-300x210.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>The next things you need are <a href=\"https:\/\/www.nuget.org\/packages\/DHTMLX.Gantt\/\">dhtmlxGantt<\/a> and <a href=\"https:\/\/www.nuget.org\/packages\/EntityFramework\/\">EntityFramework<\/a> libraries. You can install them using Nuget Package Manager.<\/p>\n<p>Once all necessary libraries are installed you can proceed to the first step.<\/p>\n<p><!--more--><\/p>\n<h3>Step 1 \u2013 Initialization<\/h3>\n<p>First of all, you need to add links to the dhtmlxGantt files. Open the <strong>_Layout.cshtml<\/strong> file and modify it as follows:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">@<\/span>ViewBag.<span class=\"me1\">Title<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>script src<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;~\/Scripts\/dhtmlxgantt\/dhtmlxgantt.js&quot;<\/span> type<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> charset<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;utf-8&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>RenderBody<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">&lt;<\/span>script src<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;~\/Scripts\/main.js&quot;<\/span> type<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> charset<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;utf-8&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>Then create <em>HomeController<\/em> with Index action. Add this HTML container for dhtmlxGantt to the Index view:<\/p>\n<div id=\"ganttContainer\" style=\"width: 100%; height: 100%;\"><\/div>\n<p>After that we need to add code that initializes the Gantt chart on a page. Create <strong>main.js<\/strong> file in the <strong>Scripts<\/strong> folder and fill it with the following data:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ add month scale<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">scale_unit<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;week&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">step<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">templates<\/span>.<span class=\"me1\">date_scale<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> dateToStr <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">date_to_str<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%d %M&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> endDate <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span>gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;week&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;day&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">return<\/span> dateToStr<span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot; - &quot;<\/span> <span class=\"sy0\">+<\/span> dateToStr<span class=\"br0\">&#40;<\/span>endDate<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">subscales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;day&quot;<\/span><span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%D&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">scale_height<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">50<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ configure milestone description<\/span><br \/>\ngantt.<span class=\"me1\">templates<\/span>.<span class=\"me1\">rightside_text<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>start<span class=\"sy0\">,<\/span> end<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">type<\/span> <span class=\"sy0\">==<\/span> gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">types<\/span>.<span class=\"me1\">milestone<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">return<\/span> task.<span class=\"me1\">text<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/ add section to type selection: task, project or milestone<\/span><br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">lightbox<\/span>.<span class=\"me1\">sections<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;description&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">70<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;textarea&quot;<\/span><span class=\"sy0\">,<\/span> focus<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;type&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;typeselect&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;type&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;time&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">72<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;auto&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\ngantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">xml_date<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;%Y-%m-%d %H:%i:%s&quot;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ format of dates in XML<\/span><br \/>\ngantt.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;ganttContainer&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ initialize gantt<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In this code we&#8217;ve specified <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__configuring_time_scale.html\" target=\"_blank\">scales configuration<\/a> &#8211; two line scale that will display days and weeks. Also we defined labels text for milestones and sections of the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__default_edit_form.html\" target=\"_blank\">task details form<\/a>. At the end we&#8217;ve specified the format of dates for data loading (this is needed to parse the server-side data correctly) and initialized our Gantt chart.<\/p>\n<p>At this point, the running application will look like this (no data yet):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2256\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-3.png\" alt=\"dhtmlxGantt with ASP.NET MVC - Empty Chart\" width=\"600\" height=\"300\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-3.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-3-300x150.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<h3>Step 2 \u2013 Creating Task and Link Models<\/h3>\n<p>Now we need to create models to store our tasks and links. In this sample we use EF Code First, so you don&#8217;t need to create database tables manually. Let&#8217;s create <em>Task<\/em> and <em>Link<\/em> classes in <strong>Model<\/strong> folder:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> GanttTask<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> GanttTaskId <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#91;<\/span>MaxLength<span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Text <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DateTime StartDate <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> Duration <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">decimal<\/span> Progress <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> SortOrder <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Type <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span><span class=\"sy0\">?<\/span> ParentId <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> GanttLink<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> GanttLinkId <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#91;<\/span>MaxLength<span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Type <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> SourceTaskId <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> TargetTaskId <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Note that classes for Tasks and Links can have any number of custom columns that can be accessed on the client-side.<\/p>\n<p>The next step is to create the database context class. Create a new folder <strong>DAL<\/strong> (for Data Access Layer). In that folder create a new class file named <strong>GanttContext.cs<\/strong>, and replace the template code with the following code:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> GanttContext <span class=\"sy0\">:<\/span> DbContext<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">public<\/span> GanttContext<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">:<\/span> <span class=\"kw1\">base<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;GanttContext&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> DbSet GanttTasks <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DbSet GanttLinks <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>In this class, we link our models with database. The context class will use connection string named &#8220;GanttContext&#8221;, so you&#8217;ll need to define one in order to fetch the database.<\/p>\n<h3>Step 3 \u2013 Loading Data<\/h3>\n<p>Now it came the turn of loading data. The client-side dhtmlxGantt component uses <a title=\"here\" href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__supported_data_formats.html#json\" target=\"_blank\">simple JSON structure<\/a>. Basically it is an object with two array properties, one for the links and one for the tasks. Task dates should be serialized in format specified in <a title=\"xml_date config\" href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_xml_date_config.html\" target=\"_blank\">gantt.config.xml_date<\/a>, that has been defined in the <strong>main.js<\/strong>. We need to create a JSON object with two arrays for <em>Tasks<\/em> and <em>Links<\/em>.<\/p>\n<p>Add <em>Data<\/em> action to <strong>HomeController.cs<\/strong> and <em>GanttContext<\/em> variable to access the database:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"csharp codecolorer\"><span class=\"co1\">\/\/ database access<\/span><br \/>\n<span class=\"kw1\">private<\/span> <span class=\"kw1\">readonly<\/span> GanttContext db <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> GanttContext<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> JsonResult GetGanttData<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> jsonData <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ create tasks array<\/span><br \/>\ndata <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n<span class=\"kw1\">from<\/span> t <span class=\"kw1\">in<\/span> db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AsEnumerable<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">select<\/span> <span class=\"kw3\">new<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nid <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTaskId<\/span>,<br \/>\ntext <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">Text<\/span>,<br \/>\nstart_date <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">StartDate<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;u&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nduration <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">Duration<\/span>,<br \/>\norder <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">SortOrder<\/span>,<br \/>\nprogress <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">Progress<\/span>,<br \/>\nopen <span class=\"sy0\">=<\/span> <span class=\"kw1\">true<\/span>,<br \/>\nparent <span class=\"sy0\">=<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">ParentId<\/span>,<br \/>\ntype <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>t<span class=\"sy0\">.<\/span><span class=\"me1\">Type<\/span> <span class=\"sy0\">!=<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> t<span class=\"sy0\">.<\/span><span class=\"me1\">Type<\/span> <span class=\"sy0\">:<\/span> <span class=\"kw4\">String<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Empty<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">ToArray<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n<span class=\"co1\">\/\/ create links array<\/span><br \/>\nlinks <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n<span class=\"kw1\">from<\/span> l <span class=\"kw1\">in<\/span> db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AsEnumerable<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">select<\/span> <span class=\"kw3\">new<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nid <span class=\"sy0\">=<\/span> l<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinkId<\/span>,<br \/>\nsource <span class=\"sy0\">=<\/span> l<span class=\"sy0\">.<\/span><span class=\"me1\">SourceTaskId<\/span>,<br \/>\ntarget <span class=\"sy0\">=<\/span> l<span class=\"sy0\">.<\/span><span class=\"me1\">TargetTaskId<\/span>,<br \/>\ntype <span class=\"sy0\">=<\/span> l<span class=\"sy0\">.<\/span><span class=\"me1\">Type<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">ToArray<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">return<\/span> <span class=\"kw3\">new<\/span> JsonResult <span class=\"br0\">&#123;<\/span> Data <span class=\"sy0\">=<\/span> jsonData, JsonRequestBehavior <span class=\"sy0\">=<\/span> JsonRequestBehavior<span class=\"sy0\">.<\/span><span class=\"me1\">AllowGet<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Then we need to configure dhtmlxGantt to <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__loading.html\" target=\"_blank\">load<\/a> data from this actions. Add the following line after the grid initialization in the <strong>main.js<\/strong> file:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">load<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/Home\/Data&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;json&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now dhtmlxGantt is able to load data. However our database is empty so let&#8217;s configure entity framework to initialize the database with test data. In the <strong>DAL<\/strong> folder, create a new class file named <strong>GanttInitializer.cs<\/strong> and replace the template code with the following code, which causes a database to be created when needed and loads test data into the new database:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> GanttInitializer <span class=\"sy0\">:<\/span> DropCreateDatabaseIfModelChanges<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">protected<\/span> <span class=\"kw1\">override<\/span> <span class=\"kw4\">void<\/span> Seed<span class=\"br0\">&#40;<\/span>GanttContext context<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; List tasks <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> List<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">new<\/span> GanttTask<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> GanttTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span>, Text <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Project #2&quot;<\/span>, StartDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddHours<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; Duration <span class=\"sy0\">=<\/span> <span class=\"nu0\">18<\/span>, SortOrder <span class=\"sy0\">=<\/span> <span class=\"nu0\">10<\/span>, Progress <span class=\"sy0\">=<\/span> 0<span class=\"sy0\">.<\/span>4m, ParentId <span class=\"sy0\">=<\/span> <span class=\"kw1\">null<\/span> <span class=\"br0\">&#125;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">new<\/span> GanttTask<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> GanttTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span>, Text <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Task #1&quot;<\/span>, StartDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddHours<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; Duration <span class=\"sy0\">=<\/span> <span class=\"nu0\">8<\/span>, SortOrder <span class=\"sy0\">=<\/span> <span class=\"nu0\">10<\/span>, Progress <span class=\"sy0\">=<\/span> 0<span class=\"sy0\">.<\/span>6m, ParentId <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span> <span class=\"br0\">&#125;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">new<\/span> GanttTask<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> GanttTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">3<\/span>, Text <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Task #2&quot;<\/span>, StartDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddHours<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; Duration <span class=\"sy0\">=<\/span> <span class=\"nu0\">8<\/span>, SortOrder <span class=\"sy0\">=<\/span> <span class=\"nu0\">20<\/span>, Progress <span class=\"sy0\">=<\/span> 0<span class=\"sy0\">.<\/span>6m, ParentId <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; tasks<span class=\"sy0\">.<\/span><span class=\"kw1\">ForEach<\/span><span class=\"br0\">&#40;<\/span>s <span class=\"sy0\">=&gt;<\/span> context<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>s<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; context<span class=\"sy0\">.<\/span><span class=\"me1\">SaveChanges<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; List links <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> List<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">new<\/span> GanttLink<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> GanttLinkId <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span>, SourceTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span>, TargetTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span>, Type <span class=\"sy0\">=<\/span> \u201c<span class=\"nu0\">1<\/span>\u201d <span class=\"br0\">&#125;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">new<\/span> GanttLink<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> GanttLinkId <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span>, SourceTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span>, TargetTaskId <span class=\"sy0\">=<\/span> <span class=\"nu0\">3<\/span>, Type <span class=\"sy0\">=<\/span> \u201c<span class=\"nu0\">0<\/span>\u201d <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; links<span class=\"sy0\">.<\/span><span class=\"kw1\">ForEach<\/span><span class=\"br0\">&#40;<\/span>s <span class=\"sy0\">=&gt;<\/span> context<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>s<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; context<span class=\"sy0\">.<\/span><span class=\"me1\">SaveChanges<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The Seed method takes the database context object as an input parameter, and the code in the method uses<br \/>\nthat object to add new entities to the database. For each entity type, the code creates a collection of new entities, adds them to the appropriate DbSet property, and then saves the changes to the database.<\/p>\n<p>To tell Entity Framework to use your initializer class, add an element to the <em>entityFramework<\/em> element in the application <strong>Web.config<\/strong> file.<\/p>\n<p>dhtmlxGantt is now ready for loading data. If you run your application, it will look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2259\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-4.png\" alt=\"dhtmlxGantt with ASP.NET MVC - Gantt Chart with Data\" width=\"600\" height=\"122\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-4.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-4-300x61.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<h3>Step 4 \u2013 Saving Changes to the Database<\/h3>\n<p>After all the steps described above, we&#8217;ve built a Gantt chart that loads the tasks from the database but that&#8217;s not enough. Our next goal is to save changes made on the client side to the server. For this we will use <a href=\"https:\/\/docs.dhtmlx.com\/dataprocessor__index.html\" target=\"_blank\">dataProcessor<\/a> on the client. This library is integrated into dhtmlxGantt and automatically traces the changes made on the client side and sends updates to the server, so we need to configure the server to handle these requests.<\/p>\n<p>First of all, we need a class which will parse and represent data action sent from the client. Create a new <em>GanttRequest<\/em> model in the <strong>Model<\/strong> folder and add the following code:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw4\">enum<\/span> GanttMode<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nTasks,<br \/>\nLinks<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">enum<\/span> GanttAction<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nInserted,<br \/>\nUpdated,<br \/>\nDeleted,<br \/>\nError<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> List Parse<span class=\"br0\">&#40;<\/span>FormCollection form, <span class=\"kw4\">string<\/span> ganttMode<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ save current culture and change it to InvariantCulture for data parsing<\/span><br \/>\n<span class=\"kw1\">var<\/span> currentCulture <span class=\"sy0\">=<\/span> Thread<span class=\"sy0\">.<\/span><span class=\"me1\">CurrentThread<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">CurrentCulture<\/span><span class=\"sy0\">;<\/span><br \/>\nThread<span class=\"sy0\">.<\/span><span class=\"me1\">CurrentThread<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">CurrentCulture<\/span> <span class=\"sy0\">=<\/span> CultureInfo<span class=\"sy0\">.<\/span><span class=\"me1\">InvariantCulture<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span> dataActions <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> List<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> prefixes <span class=\"sy0\">=<\/span> form<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;ids&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Split<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">','<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> prefix <span class=\"kw1\">in<\/span> prefixes<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> request <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> GanttRequest<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ lambda expression for form data parsing<\/span><br \/>\nFunc<span class=\"sy0\">&amp;<\/span>lt<span class=\"sy0\">;<\/span>string, <span class=\"kw4\">string<\/span><span class=\"sy0\">&amp;<\/span>gt<span class=\"sy0\">;<\/span> parse <span class=\"sy0\">=<\/span> x <span class=\"sy0\">=&amp;<\/span>gt<span class=\"sy0\">;<\/span> form<span class=\"br0\">&#91;<\/span><span class=\"kw4\">String<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Format<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;{0}_{1}&quot;<\/span>, prefix, x<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nrequest<span class=\"sy0\">.<\/span><span class=\"me1\">Mode<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>GanttMode<span class=\"br0\">&#41;<\/span><span class=\"kw4\">Enum<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>GanttMode<span class=\"br0\">&#41;<\/span>, ganttMode, <span class=\"kw1\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nrequest<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>GanttAction<span class=\"br0\">&#41;<\/span><span class=\"kw4\">Enum<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>GanttAction<span class=\"br0\">&#41;<\/span>, parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;!nativeeditor_status&quot;<\/span><span class=\"br0\">&#41;<\/span>, <span class=\"kw1\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nrequest<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span> <span class=\"sy0\">=<\/span> Int64<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ parse gantt task<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">!=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Deleted<\/span> <span class=\"sy0\">&amp;<\/span>amp<span class=\"sy0\">;&amp;<\/span>amp<span class=\"sy0\">;<\/span> request<span class=\"sy0\">.<\/span><span class=\"me1\">Mode<\/span> <span class=\"sy0\">==<\/span> GanttMode<span class=\"sy0\">.<\/span><span class=\"me1\">Tasks<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nrequest<span class=\"sy0\">.<\/span><span class=\"me1\">UpdatedTask<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> Task<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nId <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">==<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Updated<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span><span class=\"br0\">&#41;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span> <span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span>,<br \/>\nText <span class=\"sy0\">=<\/span> parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nStartDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nDuration <span class=\"sy0\">=<\/span> Int32<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;duration&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nProgress <span class=\"sy0\">=<\/span> <span class=\"kw4\">Decimal<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;progress&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nParentId <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;parent&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">!=<\/span> <span class=\"st0\">&quot;0&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> Int32<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;parent&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span><span class=\"sy0\">?<\/span><span class=\"br0\">&#41;<\/span><span class=\"kw1\">null<\/span>,<br \/>\nSortOrder <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">!=<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> Int32<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span>,<br \/>\nType <span class=\"sy0\">=<\/span> parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/ parse gantt link<\/span><br \/>\n<span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">!=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Deleted<\/span> <span class=\"sy0\">&amp;<\/span>amp<span class=\"sy0\">;&amp;<\/span>amp<span class=\"sy0\">;<\/span> request<span class=\"sy0\">.<\/span><span class=\"me1\">Mode<\/span> <span class=\"sy0\">==<\/span> GanttMode<span class=\"sy0\">.<\/span><span class=\"me1\">Links<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nrequest<span class=\"sy0\">.<\/span><span class=\"me1\">UpdatedLink<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> Link<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nId <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">==<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Updated<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span><span class=\"br0\">&#41;<\/span>request<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span> <span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span>,<br \/>\nSourceTaskId <span class=\"sy0\">=<\/span> Int32<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;source&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nTargetTaskId <span class=\"sy0\">=<\/span> Int32<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;target&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\nType <span class=\"sy0\">=<\/span> parse<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\ndataActions<span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>request<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ return current culture back<\/span><br \/>\nThread<span class=\"sy0\">.<\/span><span class=\"me1\">CurrentThread<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">CurrentCulture<\/span> <span class=\"sy0\">=<\/span> currentCulture<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">return<\/span> dataActions<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><em>GanttRequest<\/em> class has several properties to store the action info that came from the client side, and one method that creates a collection of data actions from the request values.<\/p>\n<p>The data is sent from the client in the following format:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ids:13,<br \/>\n13_!nativeeditor_status:&quot;inserted&quot;,<br \/>\n13_text: &quot;New task&quot;<br \/>\n13_duration: 1<\/div><\/div>\n<p>which is common for all DHTMLX components that use <a title=\"dhtmlxDataprocessor\" href=\"https:\/\/docs.dhtmlx.com\/dataprocessor__index.html\" target=\"_blank\">dhtmlxDataprocessor<\/a>.<\/p>\n<p>A single request may specify operations on several data items. Each property has prefix that links to an id of the related data item. All sent ids are stored in &#8220;ids&#8221; parameter and separated by commas:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ids:13,25<br \/>\n13_!nativeeditor_status:inserted,<br \/>\n25_!nativeeditor_status:updated,<br \/>\n...<\/div><\/div>\n<p>By default, requests for insert\/update contains only one id, while requests for deleting may have multiple items specified. Although, in general case, the request may contain any number of operations of different kind.<\/p>\n<p>First, we change the current culture to <em>InvariantCulture<\/em>. This is needed for more predictable parsing of request parameters &#8211; the format of dates and numbers that comes from a client-side component does not depends on the server-side culture settings. Then we parse request values into collection of individual data actions and store it in request variable (<em>GanttRequest<\/em> class has been defined in <strong>Models\/GanttRequest.cs<\/strong>).<\/p>\n<p>Note that the type of data action is defined by two properties:<\/p>\n<ul>\n<li>Mode &#8211; specifies the data entity, it can be a <em>link<\/em> or a <em>task<\/em><\/li>\n<li>Actions &#8211; specifies the type of an operation, can be <em>delete, update, insert<\/em><\/li>\n<\/ul>\n<p>Depending on action and mode, we populate <em>UpdatedTask<\/em> or <em>UpdatedLink<\/em> objects from the request values.<\/p>\n<p>Now, depending on the action, we need to save the changes. For this, we will create in <strong>HomeController.cs<\/strong> <em>Save<\/em> action, two private methods: <em>UpdateTasks<\/em> and <em>UpdateLinks<\/em>. We also create <em>GanttRespose<\/em> method for XML response.<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"csharp codecolorer\"><span class=\"br0\">&#91;<\/span>HttpPost<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">public<\/span> ContentResult UpdateGanttData<span class=\"br0\">&#40;<\/span>FormCollection form<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> ganttDataCollection <span class=\"sy0\">=<\/span> GanttData<span class=\"sy0\">.<\/span><span class=\"me1\">Parse<\/span><span class=\"br0\">&#40;<\/span>form, Request<span class=\"sy0\">.<\/span><span class=\"me1\">QueryString<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;gantt_mode&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">try<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> ganttData <span class=\"kw1\">in<\/span> ganttDataCollection<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">switch<\/span> <span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Mode<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttMode<span class=\"sy0\">.<\/span><span class=\"me1\">Tasks<\/span><span class=\"sy0\">:<\/span><br \/>\nUpdateGanttTasks<span class=\"br0\">&#40;<\/span>ganttData<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttMode<span class=\"sy0\">.<\/span><span class=\"me1\">Links<\/span><span class=\"sy0\">:<\/span><br \/>\nUpdateGanttLinks<span class=\"br0\">&#40;<\/span>ganttData<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">SaveChanges<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">catch<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ return error to client if something went wrong<\/span><br \/>\nganttDataCollection<span class=\"sy0\">.<\/span><span class=\"kw1\">ForEach<\/span><span class=\"br0\">&#40;<\/span>g <span class=\"sy0\">=&amp;<\/span>gt<span class=\"sy0\">;<\/span> <span class=\"br0\">&#123;<\/span> g<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Error<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">return<\/span> GanttRespose<span class=\"br0\">&#40;<\/span>ganttDataCollection<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">private<\/span> <span class=\"kw4\">void<\/span> UpdateGanttTasks<span class=\"br0\">&#40;<\/span>GanttData ganttData<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">switch<\/span> <span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Inserted<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ add new gantt task entity<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTask<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Deleted<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ remove gantt tasks<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Remove<\/span><span class=\"br0\">&#40;<\/span>db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Find<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Updated<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ update gantt task<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">Entry<\/span><span class=\"br0\">&#40;<\/span>db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTasks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Find<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTask<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GanttTaskId<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">CurrentValues<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">SetValues<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTask<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">default<\/span><span class=\"sy0\">:<\/span><br \/>\nganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Error<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">private<\/span> <span class=\"kw4\">void<\/span> UpdateGanttLinks<span class=\"br0\">&#40;<\/span>GanttData ganttData<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">switch<\/span> <span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Inserted<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ add new gantt link<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLink<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Deleted<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ remove gantt link<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"kw1\">Remove<\/span><span class=\"br0\">&#40;<\/span>db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Find<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">case<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Updated<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"co1\">\/\/ update gantt link<\/span><br \/>\ndb<span class=\"sy0\">.<\/span><span class=\"me1\">Entry<\/span><span class=\"br0\">&#40;<\/span>db<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinks<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Find<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLink<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinkId<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">CurrentValues<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">SetValues<\/span><span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLink<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">default<\/span><span class=\"sy0\">:<\/span><br \/>\nganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Error<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">private<\/span> ContentResult GanttRespose<span class=\"br0\">&#40;<\/span>List ganttDataCollection<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> actions <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> List<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> ganttData <span class=\"kw1\">in<\/span> ganttDataCollection<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> action <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> XElement<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;action&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\naction<span class=\"sy0\">.<\/span><span class=\"me1\">SetAttributeValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span>, ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">ToLower<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\naction<span class=\"sy0\">.<\/span><span class=\"me1\">SetAttributeValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;sid&quot;<\/span>, ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\naction<span class=\"sy0\">.<\/span><span class=\"me1\">SetAttributeValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;tid&quot;<\/span>, <span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Action<\/span> <span class=\"sy0\">!=<\/span> GanttAction<span class=\"sy0\">.<\/span><span class=\"me1\">Inserted<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">SourceId<\/span> <span class=\"sy0\">:<\/span><br \/>\n<span class=\"br0\">&#40;<\/span>ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">Mode<\/span> <span class=\"sy0\">==<\/span> GanttMode<span class=\"sy0\">.<\/span><span class=\"me1\">Tasks<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">?<\/span> ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttTask<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GanttTaskId<\/span> <span class=\"sy0\">:<\/span> ganttData<span class=\"sy0\">.<\/span><span class=\"me1\">GanttLink<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GanttLinkId<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nactions<span class=\"sy0\">.<\/span><span class=\"kw1\">Add<\/span><span class=\"br0\">&#40;<\/span>action<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span> data <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> XDocument<span class=\"br0\">&#40;<\/span><span class=\"kw3\">new<\/span> XElement<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;data&quot;<\/span>, actions<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndata<span class=\"sy0\">.<\/span><span class=\"me1\">Declaration<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> XDeclaration<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;1.0&quot;<\/span>, <span class=\"st0\">&quot;utf-8&quot;<\/span>, <span class=\"st0\">&quot;true&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">return<\/span> Content<span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, <span class=\"st0\">&quot;text\/xml&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>In the <em>Save<\/em> action we parse the request values into collection of individual data actions. Then for each data action, depending on it&#8217;s mode, we perform update on links or tasks table.<\/p>\n<p>After updates are done, we need to return the response for the client side. Method <em>GanttRespose<\/em> renders the <a title=\"dataprocessor response\" href=\"https:\/\/docs.dhtmlx.com\/dataprocessor__basic_principles.html\" target=\"_blank\">XML response<\/a> that will notify the client-side about the result of operation (success or error).<\/p>\n<p><em>UpdateGanttTaks<\/em> and <em>UpdateLinks<\/em> methods are fairly simple. They call Entity Framework function to update\/insert\/delete new tasks or links.<\/p>\n<p>XML response format is also very simple:<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"xml codecolorer\">insert:<\/div><\/div>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"xml codecolorer\">update:<\/div><\/div>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"xml codecolorer\">delete: \u2026<\/div><\/div>\n<p>We are almost done. The last thing left to do is to activate the dataProcessor on the client. Add the following lines to the end of the <strong>main.js<\/strong> file:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ enable dataProcessor<\/span><br \/>\n<span class=\"kw1\">var<\/span> dp <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dataProcessor<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/Home\/Save&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndp.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span>gantt<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now, if you run the application after these updates, you can create\/update\/delete tasks and links on your Gantt chart.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2260\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-5.png\" alt=\"dhtmlxGantt with ASP.NET MVC - Final Demo\" width=\"600\" height=\"308\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-5.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2014\/05\/gantt-chart-5-300x154.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>If you followed this tutorial, you now have built an interactive Gantt chart with ASP.NET MVC backend. The end users can create and manage tasks using an intuitive drag-and-drop interface. All the changes are saved to the server and updated in the database. Using <a title=\"gantt documentation\" href=\"https:\/\/docs.dhtmlx.com\/gantt\/\" target=\"_blank\">dhtmlxGantt API<\/a>, you can extend the functionality of your app and customize it further to your needs. Hope, this basic example will be a good help for you.<\/p>\n<p><a title=\"dhtmlxGantt with ASP.NET MVC Demo\" href=\"https:\/\/dhtmlx.com\/x\/download\/regular\/demos\/gantt-mvc-sample.zip\">Download the final demo app<\/a> to better understand this integration of dhtmlxGantt with ASP.NET MVC.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We have an updated tutorial of how to use dhtmlxGantt with ASP.NET on the server side. Unlike this guide, we use REST API so that the code appears far &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3333,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,1,38],"tags":[33,37,20,14],"class_list":["post-2250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-asp-net","tag-gantt","tag-tips"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=2250"}],"version-history":[{"count":18,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2250\/revisions"}],"predecessor-version":[{"id":15685,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2250\/revisions\/15685"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3333"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=2250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=2250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=2250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}