<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: DotVVM</title>
    <description>The latest articles on Forem by DotVVM (@dotvvm).</description>
    <link>https://forem.com/dotvvm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1911%2F32d046c1-6718-4845-a912-93327357915e.jpg</url>
      <title>Forem: DotVVM</title>
      <link>https://forem.com/dotvvm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dotvvm"/>
    <language>en</language>
    <item>
      <title>DotVVM for Visual Studio 2022 is now available</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Thu, 20 Jan 2022 15:30:51 +0000</pubDate>
      <link>https://forem.com/dotvvm/dotvvm-for-visual-studio-2022-is-now-available-4odd</link>
      <guid>https://forem.com/dotvvm/dotvvm-for-visual-studio-2022-is-now-available-4odd</guid>
      <description>&lt;p&gt;&lt;a href="https://www.dotvvm.com/" rel="noopener noreferrer"&gt;DotVVM&lt;/a&gt; is an ASP.NET framework that allows us to create web applications using the MVVM (Model, View, ViewModel) pattern with C# and HTML. &lt;/p&gt;

&lt;p&gt;As of this time, DotVVM is now available for &lt;a href="https://visualstudio.microsoft.com/vs/" rel="noopener noreferrer"&gt;Visual Studio 2022&lt;/a&gt; through an extension. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Steps to follow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To install this extension we can perform the following steps: &lt;/p&gt;

&lt;p&gt;1.- Load Visual Studio, go to the Extensions section and select Manage Extensions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkh6mxdiq39t37jnx3lq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkh6mxdiq39t37jnx3lq.png" width="435" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.- Search for DotVVM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl87edd2kna0pvj3chuoj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl87edd2kna0pvj3chuoj.png" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.- Download the extension and follow the instructions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foiwzqlsgqhgfnlg8i6h3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foiwzqlsgqhgfnlg8i6h3.png" width="431" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.- Restart Visual Studio and create a new project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y79iyx9mus91r2imyyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y79iyx9mus91r2imyyy.png" width="523" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.- Search for DotVVM and select DotVVM Web Application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkrvmfvi74tdeyzpygl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkrvmfvi74tdeyzpygl6.png" width="769" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With these steps, DotVVM is ready to be used from our Visual Studio 2022. The process is the same for Visual Studio 2019. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Additional Resources&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you want to know everything we can do with DotVVM, here are some case study articles that may be useful to you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET: Implementing CRUD operations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/building-a-dashboard-with-asp-net-core-and-dotvvm-349"&gt;Building a Dashboard with ASP.NET Core and DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM (A step by step guide)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Thanks for reading&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you have any questions or ideas in mind, it will be a pleasure to be able to be in communication and together exchange knowledge with each other.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; / &lt;a href="https://esdanielgomez.com" rel="noopener noreferrer"&gt;esDanielGomez.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>html</category>
    </item>
    <item>
      <title>DotVVM Advent Calendar 2021</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Wed, 01 Dec 2021 15:23:56 +0000</pubDate>
      <link>https://forem.com/dotvvm/dotvvm-advent-calendar-2021-3343</link>
      <guid>https://forem.com/dotvvm/dotvvm-advent-calendar-2021-3343</guid>
      <description>&lt;p&gt;Hello everyone! Welcome to &lt;em&gt;DotVVM Advent Calendar 2021&lt;/em&gt;, 25 days with 25 amazing articles to learn about DotVVM and the multiple applications we can carry out. We have an article for each of the advent days with the following general topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic concepts of ASP.NET with DotVVM. &lt;/li&gt;
&lt;li&gt;Controls for web forms. &lt;/li&gt;
&lt;li&gt;Data reports. &lt;/li&gt;
&lt;li&gt;Web pages with SQL and NoSQL databases. &lt;/li&gt;
&lt;li&gt;Deploy DotVVM applications on Azure and Amazon Web Services. &lt;/li&gt;
&lt;li&gt;Construction of applications for real life.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Calendar&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this second edition of the calendar, the general idea is learn from the basics to the most advanced about the wonderful world of web application development with ASP.NET and DotVVM through the contributions generated by the DotVVM community this year.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Contribution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 1st&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.dotvvm.com/docs/tutorials/introduction/latest" rel="noopener noreferrer"&gt;Introduction to DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 2nd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/setting-up-for-dotvvm-development-on-linux-macos-and-windows-ddda46a57380" rel="noopener noreferrer"&gt;Setting up for Dotvvm Development on Linux, MacOS and Windows&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 3rd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD operations&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 4th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/working-with-asp-net-core-and-dotvvm-on-visual-studio-code-3h7b"&gt;Working with ASP.NET Core and DotVVM on Visual Studio Code&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 5th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-controls-6bk"&gt;Web forms with DotVVM controls&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 6th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/form-validation-in-asp-net-dotvvm-7no"&gt;Form validation in ASP.NET &amp;amp; DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 7th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/reports-in-dotvvm-with-gridview-checkbox-and-textbox-controls-7f5f53c712b0" rel="noopener noreferrer"&gt;Reports in DotVVM with GridView, CheckBox, and TextBox controls&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 8th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/dotvvm-controls-gridview-3b892a8a87f6" rel="noopener noreferrer"&gt;DotVVM Controls : GridView&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 9th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-business-pack-gl1"&gt;Web forms with DotVVM Business Pack&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 10th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-upload-files-using-fileupload-control-4b85"&gt;DotVVM: upload files using FileUpload control&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;11&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 11th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/html-templates-for-repetitive-elements-in-asp-net-dotvvm-1670"&gt;HTML templates for repetitive elements in ASP.NET &amp;amp; DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 12th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/calling-javascript-functions-from-dotvvm-with-js-directive-1ci0"&gt;https://dev.to/esdanielgomez/html-templates-for-repetitive-elements-in-asp-net-dotvvm-1670&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 13th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/developing-web-applications-with-net-core-dotvvm-and-mongodb-286l"&gt;Developing web applications with ASP.NET Core, DotVVM and MongoDB&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 14th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-crud-application-with-entity-framework-and-cosmos-db-4oah"&gt;DotVVM CRUD application with Entity Framework and Cosmos DB&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 15th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM (A step by step guide).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;16&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 16th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/deploy-dotvvm-and-net-core-web-applications-to-azure-everything-you-need-to-know-3651"&gt;Deploy DotVVM and .NET Core web applications to Azure (Everything you need to know).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 17th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/github-actions-azure-continuous-deployment-of-asp-net-core-with-dotvvm-applications-1i3l"&gt;GitHub Actions + Azure: Continuous deployment of ASP.NET Core with DotVVM applications&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;18&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 18th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/working-with-wcf-services-through-asp-net-and-dotvvm-a-step-by-step-guide-34f8"&gt;Working with WCF Services through ASP.NET and DotVVM (A step-by-step guide).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;19&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 19th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://esdanielgomez.medium.com/net-hot-reload-for-dotvvm-developers-a41274cc6ce9" rel="noopener noreferrer"&gt;.NET Hot Reload for DotVVM Developers&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 20th&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/dotvvm/deploying-asp-net-core-and-dotvvm-web-applications-to-a-virtual-machine-in-azure-230f"&gt;Deploying ASP.NET Core and DotVVM web applications to a virtual machine in Azure&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 21st&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/building-a-dashboard-with-asp-net-core-and-dotvvm-349"&gt;Building a Dashboard with ASP.NET Core and DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 22nd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/deploy-web-applications-with-asp-net-core-and-dotvvm-on-aws-elastic-beanstalk-2m92"&gt;Deploy web applications with ASP.NET Core and DotVVM on AWS Elastic Beanstalk&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;23&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 23rd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://esdanielgomez.medium.com/deploying-asp-net-dotvvm-web-applications-to-a-linux-virtual-machine-in-azure-8747752a08b4" rel="noopener noreferrer"&gt;Deploying ASP.NET &amp;amp; DotVVM web applications to a Linux virtual machine in Azure&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;24&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 24th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://esdanielgomez.medium.com/sentiment-analysis-in-a-dotvvm-web-application-with-ml-net-4e1239187abb" rel="noopener noreferrer"&gt;Sentiment analysis in a DotVVM web application with ML.NET&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 25th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/guide-to-organizing-and-promoting-events-through-a-web-portal-with-asp-net-5-dotvvm-234c"&gt;Guide to organizing and promoting events through a web portal with ASP.NET &amp;amp; DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujlu06ndvbgtqvs2zu71.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujlu06ndvbgtqvs2zu71.gif" width="500" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope you enjoy and learn about DotVVM during these 25 days of advent. If you have any questions or would like to receive any feedback, you can write to me on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or request information from &lt;a href="//info@dotvvm.com"&gt;info@dotvvm.com&lt;/a&gt;. If you want to share your progress with this amazing experience, you can use the hashtags #DotVVMCommunity #DotVVMAdventCalendar :)&lt;/p&gt;

&lt;p&gt;From now on, ¡Merry Christmas!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>html</category>
    </item>
    <item>
      <title>Web portal to manage virtual or in-person events with ASP.NET 5 and DotVVM</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Wed, 27 Jan 2021 20:08:25 +0000</pubDate>
      <link>https://forem.com/dotvvm/web-portal-to-manage-virtual-or-in-person-events-with-asp-net-5-and-dotvvm-fl9</link>
      <guid>https://forem.com/dotvvm/web-portal-to-manage-virtual-or-in-person-events-with-asp-net-5-and-dotvvm-fl9</guid>
      <description>&lt;p&gt;When we organize large events such as conferences or hackathons, we often need to manage speaker data, sessions or presentations within the event, sponsors, or general event data. For this purpose, we may create an administrative web portal that allows us to handle all this data. &lt;/p&gt;

&lt;p&gt;With these considerations in mind, in this article, we'll learn in a practical way how to design a dashboard to handle data for an in-person or virtual event. This portal can help us a lot in terms of time to manage the information in a database and subsequently manage all this data in another web portal for the users/participants of the event (this second portal we will analyze in a second article). &lt;/p&gt;

&lt;p&gt;The web portal for managing events will be done ASP.NET 5 with the MVVM pattern (Model, View, Model View) with DotVVM. Where, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model.&lt;/strong&gt; — will be responsible for all application data and related business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt;. — shall correspond to representations for the end-user of the application model. The view will be responsible for displaying the data to the user and for allowing manipulation of application data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-View or View-Model.&lt;/strong&gt; — one or more per view; the view-model will be responsible for implementing view behavior to respond to user actions and exposing model data easily.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final result of the web portal will be as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffgn3iztto84t7cu8n9l3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffgn3iztto84t7cu8n9l3.png" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; The source code for this project can be found in the following GitHub repository: &lt;a href="https://github.com/esdanielgomez/EventAdmin" rel="noopener noreferrer"&gt;Event Admin&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Basic functionalities of the administrative web portal&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For the management of event data, the base options and functionality that are considered within the dashboard are described below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organizers&lt;/strong&gt;, which indicates the name of the communities and/or institutions that are organizing the event. Here you can put the social networks of the organizing group and also a description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speakers&lt;/strong&gt;, to have a list of those people who will present a session within the event. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions&lt;/strong&gt;, where the event presentations are recorded, with their respective associated speakers. Here you can also specify the type of the session (e.g. Keynote, workshop, talk, etc.), the start date, the end date, a description, and the level of difficulty of the session (basic, intermediate, advanced).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sponsors&lt;/strong&gt;, since most events can be held thanks to their sponsors, each collaborator can be registered here by specifying the company name, website, logo, and description. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we are aware of the options that will be included, let's start building our web portal.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Resources and tools needed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As initially mentioned, for the construction of the portal we will use ASP.NET 5 &amp;amp; DotVVM. In this sense, the resources and tools needed to establish our work environment are as follows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://visualstudio.microsoft.com/downloads/" rel="noopener noreferrer"&gt;Visual Studio 2019&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Workload in Visual Studio 2019: Developing ASP.NET web.&lt;/li&gt;
&lt;li&gt;
&lt;a href="//www.dotvvm.com/landing/dotvvm-for-visual-studio-extension"&gt;DotVVM Extension for Visual Studio 2019&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The database schema&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Considering the base functionalities of the administrative web portal, the dashboard has been considered a SQL database, with entities: &lt;code&gt;Organizer&lt;/code&gt;, &lt;code&gt;Sponsor&lt;/code&gt;, &lt;code&gt;Event&lt;/code&gt;, &lt;code&gt;Speaker&lt;/code&gt;, &lt;code&gt;Session&lt;/code&gt;, &lt;code&gt;Speaker_has_Session&lt;/code&gt;, &lt;code&gt;SessionLevel&lt;/code&gt;, and &lt;code&gt;SessionType&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuq66efzen3l8c8249y3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuq66efzen3l8c8249y3r.png" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this case, the database manager to be used is SQL Server, so we could initially build the dashboard on-premises, or consider some cloud resource such as Azure SQL Database, to work with the database. &lt;/p&gt;

&lt;p&gt;The SQL script for this database is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Icon&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;StartDate&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;EndDate&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;RegistrationLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;StreamingLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;Speaker&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSpeaker&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;SecondName&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;FirstLastName&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;SecondLastName&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;PhotoLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;TwitterLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;LinkedInLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSpeaker&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_Event_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_Event&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;SessionType&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSessionType&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionType&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;SessionLevel&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSessionLevel&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionLevel&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="k"&gt;Session&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSession&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;StartDate&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;EndDate&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IconLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdSessionType&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdSessionLevel&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSession&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Session_SessionType1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionType&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Session_SessionLevel1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionLevel&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Session_SessionType1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;SessionType&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Session_SessionLevel1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionLevel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;SessionLevel&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSessionLevel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;Speaker_has_Session&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSpeaker&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdSession&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_has_Session_Session1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSession&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_has_Session_Speaker1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSpeaker&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_has_Session_Speaker1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSpeaker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Speaker&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSpeaker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Speaker_has_Session_Session1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;Session&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;Organizer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdOrganizer&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;LogoLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;WebPage&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;FacebookLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;TwitterLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;InstagramLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdOrganizer&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Organizer_Event1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Organizer_Event1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- -----------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;  &lt;span class="n"&gt;Sponsor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;IdSponsor&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;LogoLink&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;WebPage&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSponsor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;fk_Sponsor_Event1_idx&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;fk_Sponsor_Event1&lt;/span&gt;
    &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;ACTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Project solution environment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Within the solution in Visual Studio 2019, we'll have three projects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70porc60nzyqq12dcz5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70porc60nzyqq12dcz5l.png" width="436" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Access Layer (DAL):&lt;/strong&gt; a class library to handle connection and access to the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BL (Business Layer):&lt;/strong&gt; another class library for service management and application domain logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PL - Presentation Layer.&lt;/strong&gt; This section is where we have Views and Viewmodels for designing web pages with DotVVM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All right, with this in mind, now let's look at the steps we need to take in these three projects for the development of our web portal.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DAL - Data Access Layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This first project corresponds to a library of classes. In this sense, as a first point, we will relate our project to the database in SQL Server. To do this, we can use Entity Framework, an object-relational mapping framework (ORM) designed to create data access applications by programming in a conceptual application model, rather than directly programming a relational storage schema.&lt;/p&gt;

&lt;p&gt;In the Entity Framework, there are two approaches, the first Code-First, which allows us to generate the database through classes, and the second, Database-First, which allows us to generate feature classes from an existing database. As expected, in this case, we will use the Database-First approach. To meet this goal, you will need to install three Nuget packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Design&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.SqlServer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then we will need to insert command from the package management console. This console can be activated from the Options Menu -&amp;gt; View -&amp;gt; Other Windows -&amp;gt; the Package Management Console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flj0yyux5zer4q0ii1vf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flj0yyux5zer4q0ii1vf3.png" width="602" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this console we will insert the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scaffold-DbContext "Server=YOUR_SERVER; Database=DATABASE_NAME; Username=YOUR_USERNAME; Password=YOUR_PASSWORD Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir DAL/Entities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we enter the command on this console, we'll have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb8v5sxq8hxkfwbjhm6b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb8v5sxq8hxkfwbjhm6b3.png" width="527" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With these steps, we already have ready the connection and configurations needed to work with the SQL Server database in ASP.NET with the help of Entity Framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;BL - Business Logic Layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now it's up to us to define the models and create the services to handle the logic of our application. In this case, we will create a second class library to have a general list of entities (&lt;code&gt;Event&lt;/code&gt;, &lt;code&gt;Organizer&lt;/code&gt;, &lt;code&gt;Session&lt;/code&gt;, &lt;code&gt;Speaker&lt;/code&gt;, &lt;code&gt;Sponsor&lt;/code&gt;) and the specific information of each of them.&lt;/p&gt;

&lt;p&gt;In the solution within Visual Studio 2019 to the final we will have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz6dyjmq96kdarxgvizlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz6dyjmq96kdarxgvizlp.png" width="428" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are two important things to mention. As a first point, the EventId class can handle the ID of the event we want to work with. In this case, the database is designed so that we can work with multiple events at once, so in this section, we can specify the ID of the event we want to reference (in the future we could handle this identifier at the web interface level).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EventId&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;EventId&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;EventId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;EventId&lt;/span&gt; &lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;EventId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A second aspect to consider is that most services implement CRUD operations (&lt;em&gt;Create&lt;/em&gt;, &lt;em&gt;Read&lt;/em&gt;, &lt;em&gt;Update&lt;/em&gt;, &lt;em&gt;Delete&lt;/em&gt;) to handle the data for each case. For example, for Organizers, the methods are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GetAllOrganizersAsync()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GetOrganizerByIdAsync(int IdOrganizer)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;InsertOrganizerAsync(OrganizerDetailModel Organizer)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UpdateOrganizerAsync(OrganizerDetailModel Organizer)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeleteOrganizerAsync(int IdOrganizer)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this mentioned, now let's look at the design of our dashboard with DotVVM.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;PL - Presentation layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For the design of the web portal, this is where DotVVM comes into action. Each page in DotVVM consists of two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A View&lt;/strong&gt;, which is based on HTML syntax and describes what the page will look like. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A ViewModel&lt;/strong&gt;, which is a class in CTM that describes the state of the page (for example, values in form fields) and handles user interactions (for example, button clicks).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For our case we will have four Views and four main ViewModels for the sections in the dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: it will be the main page, in this case only the options menu will be displayed. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt;: A page made up of a form to create a new record. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detail&lt;/strong&gt;: to view a record in detail. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit&lt;/strong&gt;: To modify or delete record information. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List&lt;/strong&gt;: to display the list of records for a particular case. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Considering the Views and Viewmodels files, in Visual Studio 2019 we'll see something like this for our entities:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqii0m0vl3wfiza7b6rrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqii0m0vl3wfiza7b6rrk.png" width="431" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, let's look at some of the main components of this administrative portal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Masterpage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In DotVVM, master pages or master pages are known as Masterpage, whose files have a &lt;code&gt;.dotmaster&lt;/code&gt; extension. In this case, this page will be useful to set our HTML skeleton, import our CSS &amp;amp; JavaScript files, and define the contents that will be visible on all child pages (&lt;em&gt;lists&lt;/em&gt;, &lt;em&gt;forms&lt;/em&gt;, &lt;em&gt;records&lt;/em&gt;).  &lt;/p&gt;

&lt;p&gt;The header of our HTML will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Event Admin&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;'width=device-width, initial-scale=1.0, shrink-to-fit=no'&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;'viewport'&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--     Fonts and icons     --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:400,700|Material+Icons"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- CSS Files --&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dot:RequiredResource&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"Styles"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A particular tag is the one found under the statement &lt;code&gt;&amp;lt;dot:RequiredResource NameTM"Styles" /&amp;gt;&lt;/code&gt;. In DotVVM, within the configuration class called &lt;code&gt;DotvvmStartUp&lt;/code&gt;, under the &lt;code&gt;ConfigureResources&lt;/code&gt; method, we can specify the location of the CSS files in our administrative portal so that they are organized in this section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ConfigureResources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DotvvmConfiguration&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;applicationPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resources&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Styles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StylesheetResource&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;UrlResourceLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"~/assets/css/material-dashboard.css?v=2.1.2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;MasterPage&lt;/code&gt; with its HTML body will be displayed as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgkidv2y6i4mxvv2ot633.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgkidv2y6i4mxvv2ot633.png" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Section 1&lt;/strong&gt;, is the HTML header where you will find the page title, CSS fonts and referenced JavaScript files, and other specifications. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 2&lt;/strong&gt;, corresponds to the logo of the page, in other words, the title within it. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 3&lt;/strong&gt;, is the portal options menu. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 4&lt;/strong&gt;, is the section where all the contents of the daughter pages (list of speakers, sponsors, sessions, organizers; and the creation and modification forms for each of these) will be displayed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the portal, visually the results according to the numbering of the previously specified sections are as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpuf7sy8fupvp0bvi52hi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpuf7sy8fupvp0bvi52hi.png" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the analysis of the child pages, let's look at two example cases, the list of organizers and a registration form for those organizers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. List – Organizers&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Up to this point, we have been able to analyze the established structure that our portal will have, now let's look at one of the child pages or also called content pages. &lt;/p&gt;

&lt;p&gt;The purpose of this first page aims to visualize through a table the organizers that are registered in the database. In this sense, in the first part of this page we find the ViewModel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ListViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MasterPageViewModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Subtitle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServerToClient&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrganizerListModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Organizers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ContUsers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ListViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrganizerService&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Organizer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Subtitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"In this section, you can see the list of organizers registered in the database."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrganizerService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;PreRender&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Organizers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllOrganizersAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PreRender&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this ViewModel class, we define the title and subtitle that the child page will have. We will also have an instance of &lt;code&gt;OrganizerService&lt;/code&gt;, which will allow us to access the methods to retrieve a list of registered organizers from the database through the &lt;code&gt;Organizer&lt;/code&gt; service (implemented in the BL).&lt;/p&gt;

&lt;p&gt;In this same class, we can locate the definition &lt;code&gt;List&amp;lt;OrganizerListModel&amp;gt; Organizers&lt;/code&gt; of type &lt;code&gt;OrganizerListModel&lt;/code&gt; (defined in the classes of the models in the BL), which will have the list of organizers (&lt;code&gt;IdOrganizer&lt;/code&gt;, and &lt;code&gt;Name&lt;/code&gt;) to load them into a table on the main page of the organizer's section. Other interesting statement is &lt;code&gt;[Bind(Direction.ServerToClient)]&lt;/code&gt;. These types of properties allow you to specify what information will be transferred from the server to the client or from the client to the server when using &lt;em&gt;Binding Directions&lt;/em&gt;. Considering the list of organizers, in many cases, it is not necessary to transfer the entire view model in both directions. The server in view will suffice in this case. &lt;/p&gt;

&lt;p&gt;Finally, in the Organizer's List ViewModel, we have the &lt;code&gt;PreRender()&lt;/code&gt; method, which allows us to perform certain types of operations that will be performed at the time of loading the page. In this case, the database will be queried through the call of one of the service methods, in this case, &lt;code&gt;OrganizerService.GetAllOrganizersAsync()&lt;/code&gt; to retrieve the list of organizers in an Organizers collection of type &lt;code&gt;OrganizerListModel&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;The second part corresponds to the View on this page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fngvr41i5trr9jfwd47n2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fngvr41i5trr9jfwd47n2.png" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the first part, we find the statement &lt;code&gt;&amp;lt;dot:Content ContentPlaceHolderIDTM"MainContent"&amp;gt;&lt;/code&gt;, which specifies the id of this content page, which is being referenced from the MasterPage in turn. &lt;/p&gt;

&lt;p&gt;In the second part we have a navbar where the title and subtitle of this home page are displayed, and in turn, a button that will redirect you to a form to create a new organizer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuc3lbvi6wbfev5y0zl4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuc3lbvi6wbfev5y0zl4t.png" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, in a third section, we have a counter of the number of registered organizers and the table where these records are listed.&lt;/p&gt;

&lt;p&gt;Only one counter in the &lt;code&gt;Organizers&lt;/code&gt; collection set in the ViewModel is displayed in the counter section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;card&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;&amp;lt;b&amp;gt;Number of registered organizers&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;card&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Organizers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2wydkcp9xwvyyuy1p5rw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2wydkcp9xwvyyuy1p5rw.png" width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The organizer table can be displayed as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxrezaj53a9ib02ymext4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxrezaj53a9ib02ymext4.png" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This table is designed through a GridView: &lt;code&gt;&amp;lt;dot:GridView ... &amp;gt;&lt;/code&gt;, a DotVVM control that allows us to create a table or crew to display a certain list of information. In HTML we would be talking about the &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; tag. One of its attributes is the DataSource: &lt;code&gt;DataSource'"-value: Organizers-"&lt;/code&gt;, which allows you to specify the data source, in this case, we refer to the list of organizers: &lt;code&gt;Organizers&lt;/code&gt;, which was defined in the ViewModel as we saw earlier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dot:GridView&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"{value: Organizers}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"table"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Columns&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dot:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;ValueBinding=&lt;/span&gt;&lt;span class="s"&gt;"{value: IdOrganizer}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"ID"&lt;/span&gt; &lt;span class="na"&gt;HeaderCssClass=&lt;/span&gt;&lt;span class="s"&gt;"text-primary"&lt;/span&gt; &lt;span class="na"&gt;CssClass=&lt;/span&gt;&lt;span class="s"&gt;"text-primary"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dot:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;ValueBinding=&lt;/span&gt;&lt;span class="s"&gt;"{value: Name}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt; &lt;span class="na"&gt;HeaderCssClass=&lt;/span&gt;&lt;span class="s"&gt;"text-primary"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dot:GridViewTemplateColumn&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;dot:RouteLink&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;RouteName=&lt;/span&gt;&lt;span class="s"&gt;"DetailOrganizer"&lt;/span&gt; &lt;span class="na"&gt;Param-IdOrganizer=&lt;/span&gt;&lt;span class="s"&gt;"{{value: IdOrganizer}}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary btn-link btn-sm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"material-icons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;visibility&lt;span class="nt"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt; Detail
            &lt;span class="nt"&gt;&amp;lt;/dot:RouteLink&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dot:GridViewTemplateColumn&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Columns&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dot:GridView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continuing with our analysis, in the &lt;code&gt;GridView&lt;/code&gt; we have the columns &lt;code&gt;IdOrganizer&lt;/code&gt;, and &lt;code&gt;Name&lt;/code&gt; of the organizers, but additionally, we can also add columns to perform operations on some specific record. In this case, with &lt;code&gt;RouteLink&lt;/code&gt;, we can define a hyperlink that constructs a URL from route names and parameter values to redirect us to other pages or perform additional operations, for example, see in detail the registration of a particular user according to their Id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dot:RouteLink&lt;/span&gt; &lt;span class="na"&gt;RouteName=&lt;/span&gt;&lt;span class="s"&gt;"DetailOrganizer"&lt;/span&gt; &lt;span class="na"&gt;Param-Id=&lt;/span&gt;&lt;span class="s"&gt;"{{value: IdOrganizer}}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These paths and their corresponding parameters must be defined in the &lt;code&gt;DotvvmStartup.cs&lt;/code&gt; file in the &lt;code&gt;ConfigureRoutes&lt;/code&gt; method as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RouteTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DetailOrganizer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"DetailOrganizer/{IdOrganizer}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Views/Organizers/Detail.dothtml"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C. Registration Form – Organizers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Within the portal, there are other options for creating, modifying, and deleting a record from a particular organizer. In this case, to generalize, let's analyze the Create Organizer page. Like the &lt;code&gt;List&lt;/code&gt;, the &lt;code&gt;Create&lt;/code&gt; page is one that will be the daughter of the &lt;code&gt;MasterPage&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;As the name implies, this page aims to create a new organizer through a form within the web portal. The result is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpx2sakygr1f2hkmvbhjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpx2sakygr1f2hkmvbhjz.png" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, in the form, all components correspond to text boxes for data entry. Let's look at one of them, for example, the &lt;code&gt;Name&lt;/code&gt; field in the View will be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;col&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;form&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;group&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;=""&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;TextBox&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{value: Organizer.Name}"&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;form&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="s"&gt;" /&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we can comment on two things. The first, that for text boxes we can use a DotVVM component that allows us to associate a &lt;code&gt;TextBox&lt;/code&gt; with an attribute in the ViewModel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;OrganizerDetailModel&lt;/span&gt; &lt;span class="n"&gt;Organizer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OrganizerDetailModel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also accompany this &lt;code&gt;TextBox&lt;/code&gt; with a control called &lt;code&gt;Validator&lt;/code&gt;, which allows us to validate certain characteristics, for example, that the field cannot be registered as null. In these two components, we can add additional specifications, such as the corresponding styles for each case. &lt;/p&gt;

&lt;p&gt;The send button will follow the same logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Insert Organizer"&lt;/span&gt; &lt;span class="n"&gt;Click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{command: AddOrganizer()}"&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;btn&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="s"&gt;" /&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This button, set through a DotVVM component, is calling a function set in the ViewModel to add a user based on the data inserted into the form. This function is structured as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;AddOrganizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;OrganizerService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InsertOrganizerAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Organizer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RedirectToRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Organizer"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, by inserting the record successfully, from the ViewModel, we can redirect to the &lt;code&gt;List&lt;/code&gt; page (page with the list of registered organizers) and view the new organizer inserted into the database and displayed in the general list.&lt;/p&gt;

&lt;p&gt;As mentioned earlier, the detail and editing pages follow the same design logic in this case; similarly for the &lt;code&gt;Speakers&lt;/code&gt;, &lt;code&gt;Sessions&lt;/code&gt;, and &lt;code&gt;Sponsors&lt;/code&gt; sections. &lt;/p&gt;

&lt;p&gt;Below are some additional screenshots for the &lt;code&gt;Speakers&lt;/code&gt;, &lt;code&gt;Sessions&lt;/code&gt; and &lt;code&gt;Sponsors&lt;/code&gt; registration forms respectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzy8w5sc2db83wkvx6pet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzy8w5sc2db83wkvx6pet.png" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frvsi6668gdzg34lto37y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frvsi6668gdzg34lto37y.png" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp0964ka4q1cv661jab3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp0964ka4q1cv661jab3p.png" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What's next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With this tutorial article, we have learned in general how to control the data of our events, whether for conferences or hackathons, for virtual meetings, or in person, through ASP.NET 5 &amp;amp; DotVVM.  &lt;/p&gt;

&lt;p&gt;The code in this tutorial can be found in the following repository on GitHub: &lt;a href="https://github.com/esdanielgomez/EventAdmin" rel="noopener noreferrer"&gt;Event Admin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the next article, we can learn how to use the same data stored in the database with SQL Server, but this time to represent it in a web portal where users or attendees can learn about sessions, speakers, and everything else. In the case of the list of organizers, in this second portal we could have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flb2so02701voblcdh83t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flb2so02701voblcdh83t.png" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Soon we will also have the explanation of this portal for our attendees, and of course, the source code as well. :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional resources:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today there are many applications that we can build in the .NET ecosystem, and even more specifically in the area of web page development. In this sense, below are some additional resources to further acquire knowledge in this field:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/net-5-deploying-web-apps-with-azure-app-service-5349"&gt;.NET 5: Deploying web apps with Azure App Service&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/deploy-web-applications-with-asp-net-core-and-dotvvm-on-aws-elastic-beanstalk-2m92"&gt;Deploy web applications with ASP.NET Core and DotVVM on AWS Elastic Beanstalk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM (A step by step guide)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you very much for reading, I hope this demo can be of use to you. If you have any questions or ideas that you need to discuss, it will be nice to be able to collaborate and together exchange knowledge with each other.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;! Or if you like you can also write to me by &lt;a href="https://t.me/esdanielgomez" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;. :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>html</category>
      <category>csharp</category>
    </item>
    <item>
      <title>DotVVM Advent Calendar 2020</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Tue, 01 Dec 2020 05:05:03 +0000</pubDate>
      <link>https://forem.com/dotvvm/dotvvm-advent-calendar-2020-3ci</link>
      <guid>https://forem.com/dotvvm/dotvvm-advent-calendar-2020-3ci</guid>
      <description>&lt;p&gt;Hello everyone! Welcome to &lt;em&gt;DotVVM Advent Calendar 2020&lt;/em&gt;, 25 days with 25 amazing articles to learn about DotVVM and the multiple applications we can carry out. We have an article for each of the advent days with the following general themes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basics of ASP.NET with DotVVM. &lt;/li&gt;
&lt;li&gt;Controls for web forms. &lt;/li&gt;
&lt;li&gt;Data reporting. &lt;/li&gt;
&lt;li&gt;Web pages with SQL and NoSQL databases. &lt;/li&gt;
&lt;li&gt;Deploying dotVVM applications to Azure and Amazon Web Services &lt;/li&gt;
&lt;li&gt;Construction of applications for real life. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Calendar&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The main idea of this initiative in its first edition is that among all we can learn from the basics to the most advanced about the wonderful world of web application development with ASP.NET and DotVVM through the contributions generated by the DotVVM community this year.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Contribution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 1st&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.dotvvm.com/docs/tutorials/introduction/latest" rel="noopener noreferrer"&gt;Introduction to DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 2nd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/setting-up-for-dotvvm-development-on-linux-macos-and-windows-ddda46a57380" rel="noopener noreferrer"&gt;Setting up for Dotvvm Development on Linux, MacOS and Windows&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 3rd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD operations&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 4th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/working-with-asp-net-core-and-dotvvm-on-visual-studio-code-3h7b"&gt;Working with ASP.NET Core and DotVVM on Visual Studio Code&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 5th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-controls-6bk"&gt;Web forms with DotVVM controls&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 6th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-build-conditional-validation-attribute-58c8"&gt;DotVVM:Build Conditional Validation Attribute&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 7th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/reports-in-dotvvm-with-gridview-checkbox-and-textbox-controls-7f5f53c712b0" rel="noopener noreferrer"&gt;Reports in DotVVM with GridView, CheckBox, and TextBox controls&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 8th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/dotvvm-controls-gridview-3b892a8a87f6" rel="noopener noreferrer"&gt;DotVVM Controls : GridView&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 9th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-business-pack-gl1"&gt;Web forms with DotVVM Business Pack&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 10th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-upload-files-using-fileupload-control-4b85"&gt;DotVVM: upload files using FileUpload control&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;11&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 11th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/star-rating-with-dotvvm-and-css-1jph"&gt;Star rating with DotVVM and CSS&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 12th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-add-shortcuts-to-your-buttons-and-links-12ep"&gt;DotVVM: Add shortcuts to your buttons and links&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 13th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/developing-web-applications-with-net-core-dotvvm-and-mongodb-286l"&gt;Developing web applications with ASP.NET Core, DotVVM and MongoDB&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 14th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-crud-application-with-entity-framework-and-cosmos-db-4oah"&gt;DotVVM CRUD application with Entity Framework and Cosmos DB&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 15th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM (A step by step guide).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;16&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 16th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/deploy-dotvvm-and-net-core-web-applications-to-azure-everything-you-need-to-know-3651"&gt;Deploy DotVVM and .NET Core web applications to Azure (Everything you need to know).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 17th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/github-actions-azure-continuous-deployment-of-asp-net-core-with-dotvvm-applications-1i3l"&gt;GitHub Actions + Azure: Continuous deployment of ASP.NET Core with DotVVM applications&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;18&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 18th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/working-with-wcf-services-through-asp-net-and-dotvvm-a-step-by-step-guide-34f8"&gt;Working with WCF Services through ASP.NET and DotVVM (A step-by-step guide).&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;19&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 19th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-authorization-with-identityserver4-3jn4"&gt;DotVVM Authorization with IdentityServer4&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 20th&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/dotvvm/deploying-asp-net-core-and-dotvvm-web-applications-to-a-virtual-machine-in-azure-230f"&gt;Deploying ASP.NET Core and DotVVM web applications to a virtual machine in Azure&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 21st&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-crud-application-with-cloud-firestore-101b"&gt;DotVVM CRUD application with Cloud Firestore&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 22nd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/deploy-web-applications-with-asp-net-core-and-dotvvm-on-aws-elastic-beanstalk-2m92"&gt;Deploy web applications with ASP.NET Core and DotVVM on AWS Elastic Beanstalk&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;23&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 23rd&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://medium.com/dotvvm/containerize-a-dotvvm-web-application-and-a-mysql-database-with-docker-compose-6c74c9780ee1" rel="noopener noreferrer"&gt;Containerize a Dotvvm Web Application and a MySql Database with Docker Compose&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;24&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 24th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/dotvvm/build-azure-pipeline-to-your-dotvvm-application-2a0i"&gt;Build Azure Pipeline to your DotVVM application&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 25th&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://dev.to/esdanielgomez/building-a-dashboard-with-asp-net-core-and-dotvvm-349"&gt;Building a Dashboard with ASP.NET Core and DotVVM&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujlu06ndvbgtqvs2zu71.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujlu06ndvbgtqvs2zu71.gif" width="500" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope you enjoy and learn about DotVVM during these 25 days of advent. If you have any questions or would like to receive any feedback, you can write to me on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or request information from &lt;a href="//info@dotvvm.com"&gt;info@dotvvm.com&lt;/a&gt;. If you want to share your progress with this amazing experience, you can use the hashtags #DotVVMCommunity #DotVVMAdventCalendar :)&lt;/p&gt;

&lt;p&gt;From now on, ¡Merry Christmas!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>webdev</category>
      <category>csharp</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Website for data reporting with DotVVM Business Pack</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Mon, 24 Aug 2020 18:53:03 +0000</pubDate>
      <link>https://forem.com/dotvvm/website-for-data-reporting-with-dotvvm-business-pack-2a8p</link>
      <guid>https://forem.com/dotvvm/website-for-data-reporting-with-dotvvm-business-pack-2a8p</guid>
      <description>&lt;p&gt;In many cases when we working with systems that aim to perform operations on a database, there is a need to include a section within these systems to visualize the corresponding data. Within web pages, tables are typically used to represent information, search sections to filter information, and more. &lt;/p&gt;

&lt;p&gt;In this article we will learn how to design in a simple way, a web page to visualize certain data hosted in tables in a database relates through ASP.NET Core and DotVVM. In previous articles, we were able to learn in general how to use predefined DotVVM controls for data visualization as a report. Here are some of those articles: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD Operations&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/working-with-asp-net-core-and-dotvvm-on-visual-studio-code-3h7b"&gt;Working with ASP.NET Core and DotVVM in Visual Studio Code&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, when you manage forms to manage information, you need to create tables before you can view the processed data. Here are some previous articles in case you want to learn how to design HTML forms with DotVVM: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-controls-6bk"&gt;Web forms with DotVVM controls&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/web-forms-with-dotvvm-business-pack-gl1"&gt;Web Form Design with DotVVM Business Pack&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/web-forms-with-bootstrap-for-dotvvm-from-asp-net-core-39ge"&gt;Web forms with Bootstrap for DotVVM from ASP.NET Core&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This time we will learn the basics of visualizing certain data and establishing some search criteria with C- and HTML, through DotVVM's premium controls on ASP.NET Core, referred to as DotVVM Business Pack. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: The project source code that we will discuss in this article can be found in this GitHub repository: &lt;a href="https://github.com/esdanielgomez/DotVVMReportsBusinessPack" rel="noopener noreferrer"&gt;Reports in DotVVM with Business Pack controls&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Model, View, ViewModel Pattern
&lt;/h4&gt;

&lt;p&gt;DotVVM is based on the Design Pattern Model, View, ViewModel over .NET for communication between HTML (web pages) and C- (source code). The purpose of these parts are as follows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model.&lt;/strong&gt; — is responsible for all application data and related business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The view.&lt;/strong&gt; — Representations for the end-user of the application model. The view is responsible for displaying the data to the user and allowing manipulation of application data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-View or View-Model.&lt;/strong&gt; — one or more per view; the model-view is responsible for implementing view behavior to respond to user actions and for easily exposing model data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How do We access DotVVM Business Pack?
&lt;/h4&gt;

&lt;p&gt;Business Pack is a private NuGet, in which we can make use of the competent premiums already established by DotVVM for the construction of web applications in the business field. &lt;/p&gt;

&lt;p&gt;For the installation of the DotVVM Business Pack version, it is necessary to configure a few minutes to be able to use these functionalities. It all comes down to the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the DotVVM extension for Visual Studio 2019. &lt;/li&gt;
&lt;li&gt;Purchase Business Pack (trial version exists) at the following address: &lt;a href="https://www.dotvvm.com/products/dotvvm-business-pack" rel="noopener noreferrer"&gt;DotVVM Business Pack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sign in to the DotVVM extension for Visual Studio 2019. To do this, we can go to the Visual Studio options menu in the path: Extensions -&amp;gt; DotVVM -&amp;gt; About. And ready, that'll be it. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffyqai7lsivp5hzrzri0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffyqai7lsivp5hzrzri0r.png" width="636" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Report with ASP.NET Core and DotVVM&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To exemplify the use of some DotVVM Business Pack controls for reporting, we have a small application like this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu0nk4plhsfzoajxhybim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu0nk4plhsfzoajxhybim.png" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk9sjrfpojq60puiumtas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk9sjrfpojq60puiumtas.png" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taking into account the MVVM – Model, View, ViewModel pattern, we will analyze in general each of these parts for this project, which aims to display the data of particular users. &lt;/p&gt;

&lt;h4&gt;
  
  
  Model
&lt;/h4&gt;

&lt;p&gt;Application and related business logic data is handled in this section. In this sense, we will see how the data and the corresponding services are handled. &lt;/p&gt;

&lt;p&gt;The database consists of two tables: &lt;em&gt;Person&lt;/em&gt; and &lt;em&gt;PersonType&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmkyuk0nqianq04z5v6cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmkyuk0nqianq04z5v6cr.png" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The SQL statements for creating these tables, their attributes, and inserting some records are as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="nb"&gt;CHARACTER&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`PersonType`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nv"&gt;`Id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`Name`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`Description`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`Person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nv"&gt;`Id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`FirstName`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`LastName`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`PersonType`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`persontype`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Description`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Type A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`persontype`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Description`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Type B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sergey'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Brin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Larry'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Page'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Barners'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Linus'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Torvalds'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Larry'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ellison'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'6'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ballmer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'7'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Jobs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'8'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Marc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Benioff'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ray'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ozzie'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Nicholas'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Negroponte'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Diane'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Green'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Palmisano'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'13'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Blake'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ross'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'14'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ralph'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Szygenda'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'15'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Rick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Dalzell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the database set, the portion of the data access layer refers to the definition of the classes to work with the database features and the context to establish communication between ASP.NET Core and the database, which in this case MySQL is the one being used. &lt;/p&gt;

&lt;p&gt;For this purpose, you need to install three NuGet packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Design&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MySql.Data.EntityFrameworkCore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are working with SQL Server, the NuGet package to install will be: &lt;code&gt;Microsoft.EntityFrameworkCore.SQLServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You then need to use the package management console to scaffold from the database (automatically generate the context and feature classes) using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scaffold-DbContext "server=servername;port=portnumber;user=username;password=pass;database=databasename" MySql.Data.EntityFrameworkCore -OutputDir Entities -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this first part, the connection to the database is listed. What follows is the definition of models with which the website will be worked. These models are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NamePersonType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonTypeModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each of these models there is a service, which has the following operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonsAsync()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonByIdAsync(int personId)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonByIdAndTypeAsync(int personId, int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonsByTypeAsync(int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PersonTypeService&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonTypesAsync()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonTypeByIdAsync(int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Visual Studio 2019 we'll have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmobwig7nrjcfg4etc10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmobwig7nrjcfg4etc10.png" width="366" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  ViewModel
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DefaultViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MasterPageViewModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;PersonService&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;BusinessPackDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Persons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BusinessPackDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;IdSearch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsWindowDisplayed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DefaultViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonService&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;personService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;UpdatePersonList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;IdSearch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsByTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;SearchById&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonByIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonByIdAndTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsByTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  View
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dot:Content&lt;/span&gt; &lt;span class="na"&gt;ContentPlaceHolderID=&lt;/span&gt;&lt;span class="s"&gt;"MainContent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/tree.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__background-image content__background-image--left"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.dotvvm.com/"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/text.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;PERSON REPORT FORM&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"~/icon.png"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"15%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"15%"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;bp:Window&lt;/span&gt; &lt;span class="na"&gt;IsDisplayed=&lt;/span&gt;&lt;span class="s"&gt;"{value: IsWindowDisplayed}"&lt;/span&gt;
                       &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Reporting form"&lt;/span&gt;
                       &lt;span class="na"&gt;CloseOnEscape=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
                       &lt;span class="na"&gt;CloseOnOutsideClick=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Person report&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Search by type:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                             &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                             &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 1}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type A"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                             &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                             &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 2}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type B"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Search by text:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                ID Number:
                &lt;span class="nt"&gt;&amp;lt;bp:TextBox&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: IdSearch}"&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Number"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt; &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: SearchById()}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-button"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Report:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;bp:GridView&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"{value: Persons}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Columns&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Id}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: FirstName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Firstname"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: LastName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"LastName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: NamePersonType}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Type"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/Columns&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;EmptyDataTemplate&amp;gt;&lt;/span&gt;
                        There are no search results.
                    &lt;span class="nt"&gt;&amp;lt;/EmptyDataTemplate&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/bp:GridView&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;/bp:Window&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"LOAD REPORT"&lt;/span&gt;
                       &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: IsWindowDisplayed = true}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/tree.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__background-image content__background-image content__background-image--right"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dot:Content&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Application Analysis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the following GIF, we can see in a general way the interaction with this small web page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0809dabdz1rjleuv7fm2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0809dabdz1rjleuv7fm2.gif" width="1660" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first element we will analyze is the &lt;code&gt;Window&lt;/code&gt; component, which represents a modal dialog box, as in HTML. This control allows us to customize directly from its attributes as the window will be displayed. If we were working with DotVVM's base controls, to achieve this functionality we would have to make use of some Javascript functionalities directly to set the window. In this example, the window title can be assigned. You can also customize certain properties, such as not allowing the window to close by pressing the Escape key or clicking outside the window box.&lt;/p&gt;

&lt;p&gt;In this example, the Boolean attribute &lt;code&gt;IsWindowDisplayed&lt;/code&gt;, according to its value &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, will allow whether or not to display the settings window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:Window&lt;/span&gt; &lt;span class="na"&gt;IsDisplayed=&lt;/span&gt;&lt;span class="s"&gt;"{value: IsWindowDisplayed}"&lt;/span&gt;
            &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Reporting form"&lt;/span&gt;
            &lt;span class="na"&gt;CloseOnEscape=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
            &lt;span class="na"&gt;CloseOnOutsideClick=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the definition of the &lt;code&gt;IsWindowDisplayed&lt;/code&gt; attribute for the window display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsWindowDisplayed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To display the window, a button is used. This button is also another of the Business Pack components. The premium version allows you to make certain customizations in terms of its styles, for example, enable/disable the button, assign an icon, among other functionalities: &lt;a href="https://www.dotvvm.com/docs/controls/businesspack/Button/2.0" rel="noopener noreferrer"&gt;Button/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The result is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnuzuyipzui2i1rccfyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnuzuyipzui2i1rccfyo.png" width="742" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within this window, the most important item corresponds to the table that allows users registered in the database to be listed. For this purpose, we use the &lt;code&gt;GridView&lt;/code&gt; element, another DotVVM control that allows us to create tables to represent specific data. As the main part, the control allows us to indicate the data source through the &lt;code&gt;DataSource&lt;/code&gt; property, in this case, the data source is defined as follows in the ViewModel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GridViewDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Persons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GridViewDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;GridViewTextColumn&lt;/code&gt; tag is used for a column definition. In this case, we can find the &lt;em&gt;Id&lt;/em&gt;, &lt;em&gt;FirstName&lt;/em&gt;, &lt;em&gt;LastName&lt;/em&gt; and &lt;em&gt;Type&lt;/em&gt; columns. These names come from the data type of the data source, in this case, from the &lt;code&gt;PersonModel&lt;/code&gt; model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:GridView&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"{value: Persons}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Columns&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Id}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: FirstName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Firstname"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: LastName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"LastName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: NamePersonType}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Type"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Columns&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;EmptyDataTemplate&amp;gt;&lt;/span&gt;
        There are no search results.
    &lt;span class="nt"&gt;&amp;lt;/EmptyDataTemplate&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bp:GridView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One of the sub-tags in &lt;code&gt;GridView&lt;/code&gt; is &lt;code&gt;EmptyDataTemplate&lt;/code&gt;, which is also included in DotVVM base controls. This tag allows you to display some HTML content in case the list of items is empty. In the end, with &lt;code&gt;GridView&lt;/code&gt; we will visualize something like this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fipigzzjdzca3vhzgz3pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fipigzzjdzca3vhzgz3pm.png" width="631" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more about the &lt;code&gt;GridView&lt;/code&gt; component here: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/GridView/2.0" rel="noopener noreferrer"&gt;GridView/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All right, with this table, we have the most important part of the report. From this, we can add additional components to set search criteria for example, and update this table based on the search. &lt;/p&gt;

&lt;p&gt;The first case is using the premium version of the DotVVM &lt;code&gt;CheckBox&lt;/code&gt; control. As in HTML or any other design environment, the &lt;code&gt;CheckBox&lt;/code&gt; has the role of a checkbox for selecting items in an option set. For this example, the goal is to have two checkboxes, which correspond to the types of people. Depending on the selection, either type A, type B, or both, the table of records will be updated in accordance with this decision. &lt;/p&gt;

&lt;p&gt;In the view part, we find the &lt;code&gt;CheckedItems&lt;/code&gt; property that stores the value of the items that are selected. We also find the &lt;code&gt;Changed&lt;/code&gt; property, which allows you to specify the method that will perform the actions at the time this element is activated or disabled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 1}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type A"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 2}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type B"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the method of updating the records in the table, if we select one of the two types, then we will query the database according to the defined service: &lt;code&gt;PersonService&lt;/code&gt;, to get the list of people according to the selected id. With this list retrieved, we will update the database by re-setting the items in the &lt;code&gt;GridView&lt;/code&gt; data source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we saw in the GIF, the result of using the &lt;code&gt;CheckBox&lt;/code&gt; control is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1xmxvik11tnov5t9vk1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1xmxvik11tnov5t9vk1y.png" width="218" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn more about the CheckBox component here: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/CheckBox/2.0" rel="noopener noreferrer"&gt;CheckBox/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another of the controls that allow us to continue adding functionality to the GridView to set the search criteria for this report is the &lt;code&gt;TextBox&lt;/code&gt; and &lt;code&gt;Button&lt;/code&gt; elements. In this case, these components can be used to search for something specific to the report through a text entry. To exemplify the use of these elements in your app, the controls are used to find a specific person based on their ID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;ID Number:

&lt;span class="nt"&gt;&amp;lt;bp:TextBox&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: IdSearch}"&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Number"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt; &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: SearchById()}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-button"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Updating the elements of the &lt;code&gt;GridView&lt;/code&gt; is similar to the &lt;code&gt;CheckBox&lt;/code&gt; case. The result is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tus4wg8m0jebtjf17mq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tus4wg8m0jebtjf17mq.png" width="636" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the information about the TextBox control can be found in: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/TextBox/2.0" rel="noopener noreferrer"&gt;TextBox/2.0&lt;/a&gt;. Y la del control Button en: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/Button/2.0" rel="noopener noreferrer"&gt;Button/2.0&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What's next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this article, we learned certain features of the &lt;code&gt;Windows&lt;/code&gt;, &lt;code&gt;GridView&lt;/code&gt;, &lt;code&gt;CheckBox&lt;/code&gt;, &lt;code&gt;TextBox&lt;/code&gt; and &lt;code&gt;Button&lt;/code&gt; components of DotVVM's Business Pack control set to display a list of data and set search criteria through the Model, View, ViewModel pattern in ASP.NET Core and DotVVM. &lt;/p&gt;

&lt;p&gt;The source code for this implementation is available in this repository: &lt;a href="https://github.com/esdanielgomez/DotVVMReportsBusinessPack" rel="noopener noreferrer"&gt;Reports in DotVVM with Business Pack controls&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Here are some additional resources that might be of interest to you to continue to gain new knowledge in this area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free and open course on YouTube (Spanish): &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;ASP.NET Core and DotVVM Fundamentals&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD Operations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Thank you:
&lt;/h4&gt;

&lt;p&gt;If you have any concerns or need help in something particular, it will be a pleasure to be able to collaborate.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

</description>
      <category>wevdev</category>
      <category>dotnet</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>GitHub Actions + Azure: Implementación continua de aplicaciones con ASP.NET Core y DotVVM</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Tue, 11 Aug 2020 21:16:57 +0000</pubDate>
      <link>https://forem.com/dotvvm/github-actions-azure-implementacion-continua-de-aplicaciones-con-asp-net-core-y-dotvvm-2ac5</link>
      <guid>https://forem.com/dotvvm/github-actions-azure-implementacion-continua-de-aplicaciones-con-asp-net-core-y-dotvvm-2ac5</guid>
      <description>&lt;p&gt;En el mundo del desarrollo de software, palabras como implementación continua siempre se encuentran presentes. En este caso, la implementación continua es una estrategia para las versiones de software, para que cualquier confirmación de código que pase la fase de pruebas de forma automatizada, se libere automáticamente en un entorno de producción, desplegando los cambios que son visibles para los usuarios del software en cuestión.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu33zv2mw7ea0fwuult2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu33zv2mw7ea0fwuult2.png" width="388" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta es una pequeña variación de la entrega continua, pues si antes se tenía que realizar un despliegue manual, aquí en (CD) simplemente por cada merge a la rama máster se procede a realizar un despliegue de forma automática, el proceso queda de la siguiente manera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control de cambios (Source Control)&lt;/li&gt;
&lt;li&gt;Construcción y Pruebas (Build and Tests)&lt;/li&gt;
&lt;li&gt;Puesta en escena (Staging)&lt;/li&gt;
&lt;li&gt;Despliege a Producción (Production): Última versión corriendo en la web principal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teniendo en cuenta estas consideraciones, con la implementación continua, se automatiza todo el proceso desde la confirmación de código hasta la producción. El desencadenador entre las fases de desarrollo y entrega es automático, por lo que los cambios de código se insertan en vivo una vez que reciben la validación y pasan todas las pruebas. Esto significa que los usuarios reciben mejoras tan pronto como están disponibles.&lt;/p&gt;

&lt;p&gt;En este articulo tutorial aprenderemos paso a paso el proceso de implementación continua de una aplicación web desarrollada con DotVVM a través de ASP.NET Core para publicarla de forma automática y continua en un recurso App Service de Azure, empleando GitHub Actions. &lt;/p&gt;

&lt;p&gt;En relación a los Actions de GitHub, esta es una funcionalidad que nos permite crear flujos de trabajo (workflows) que se pueden utilizar para compilar, probar y desplegar código, dando la posibilidad de crear flujos de integración y despliegue continuo dentro del propio repositorio de GitHub como veremos más adelante. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actividades&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Para llevar a cabo las actividades de despliegue continuo, tendemos tres partes importantes dentro de este proceso: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parte 1: Asociar el proyecto en cuestión desde Visual Studio 2019 con un repositorio en GitHub.&lt;/li&gt;
&lt;li&gt;Parte 2: Crear un recurso App Service en Azure. &lt;/li&gt;
&lt;li&gt;Parte 3: Configurar las acciones de despliegue hacia Azure en el repositorio de GitHub. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recursos necesarios&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Para seguir paso a paso este artículo, es necesario tener en funcionamiento las siguientes herramientas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET Core SDK.&lt;/li&gt;
&lt;li&gt;Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;La carga de trabajo: Desarrollo web y ASP.NET, para Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;La extensión de DotVVM para Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;Una cuenta de GitHub. &lt;/li&gt;
&lt;li&gt;Una suscripción de Azure.&lt;/li&gt;
&lt;li&gt;En caso de que el proyecto este asociado a una base de datos, esta deberá estar alojada en la nube.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;El entorno de la solución&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Los proyectos para el desarrollo de aplicaciones con ASP.NET Core y DotVVM se fundamentan en el patrón Modelo, Vista, Vistamodelo; para la comunicación entre HTML (páginas web) y C# (código fuente). La finalidad de estas partes son las siguientes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;El modelo.&lt;/strong&gt; — es responsable de todos los datos de la aplicación y de la lógica de negocios relacionada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La vista.&lt;/strong&gt; — Representaciones para el usuario final del modelo de la aplicación. La vista es responsable de mostrar los datos al usuario y de permitir la manipulación de los datos de la aplicación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El Modelo-Vista o Vista-Modelo.&lt;/strong&gt; — uno o más por vista; el modelo-vista es responsable de implementar el comportamiento de la vista para responder a las acciones del usuario y de exponer los datos del modelo fácilmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este caso, existen tres proyectos para este propósito:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DAL (Data Access Layer):&lt;/strong&gt; para manejar la conexión y el acceso a la base de datos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BL (Business Layer):&lt;/strong&gt; para el manejo de los servicios y la lógica del dominio de la aplicación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APP - Capa de presentación de la aplicación.&lt;/strong&gt; En esta sección es donde tenemos los Views y Viewmodels para el diseño de las páginas web con DotVVM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La solución en Visual Studio 2019 tiene el siguiente aspecto: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnau9uj1rjh3xdpggcafb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnau9uj1rjh3xdpggcafb.png" width="438" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¿Deseas saber cuáles son los pasos para crear una aplicación DotVVM? Para ello puedes revisar este articulo: &lt;a href="https://medium.com/@esdanielgomez/pasos-a-seguir-para-crear-una-aplicaci%C3%B3n-mvvm-modelo-vista-vista-modelo-con-dotvvm-y-asp-net-core-41afd67125b1" rel="noopener noreferrer"&gt;Pasos para crear una aplicación MVVM (Model-View-Viewmodel) con DotVVM y ASP.NET Core&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 1: Asociar el proyecto desde Visual Studio 2019 con un repositorio en GitHub&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Lo primero que debemos hacer es verificar que tengamos instalada la extensión de GitHub para Visual Studio 2019. Para esto podemos dirigirnos al menú de opciones en la sección &lt;em&gt;Extensiones&lt;/em&gt; y seleccionar la opción &lt;em&gt;Manejar Extensiones&lt;/em&gt;. En este recuadro podremos realizar la verificación. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7s11k9cezkbtg7n4vajh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7s11k9cezkbtg7n4vajh.png" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En caso de que no se cuente con la extensión de GitHub para Visual Studio 2019, el instalador se puede encontrar en la siguiente dirección: &lt;a href="https://visualstudio.github.com/" rel="noopener noreferrer"&gt;https://visualstudio.github.com/&lt;/a&gt;. Para agregar la extensión, Visual Studio debe estar cerrado ya que son cambios al IDE de Microsoft que se realizan durante la instalación. &lt;/p&gt;

&lt;p&gt;Ahora sí, dicho esto, procedemos a asociar a la solución que contiene los tres proyectos (.APP, .BL y .DAL) a un repositorio en GitHub, para ello damos clic derecho en la solución de Visual Studio y seleccionamos agregar solución al control de código fuente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmgacjdvf97xwrn0z1v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmgacjdvf97xwrn0z1v2.png" width="420" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Posteriormente nos dirigimos a la vista &lt;em&gt;Team Explorer&lt;/em&gt; y conectamos nuestra cuenta de GitHub con Visual Studio en la opción &lt;em&gt;Conectar&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu1l16b6a9biuqj1yh8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu1l16b6a9biuqj1yh8c.png" width="352" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego nos dirigimos a la opción del &lt;em&gt;Team Explorer&lt;/em&gt;: &lt;em&gt;Sincronización&lt;/em&gt;: seleccionamos &lt;em&gt;Publicar en GitHub&lt;/em&gt; y continuamos con las instrucciones presentadas para la creación de un nuevo repositorio. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi5zjuajjsittrbwx5tta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi5zjuajjsittrbwx5tta.png" width="761" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poco tiempo después, nuestro proyecto estará asociado al repositorio que acabamos de crear. Esto lo podemos comprobar directamente desde GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpygk6bm602buwu3dri4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpygk6bm602buwu3dri4q.png" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nota: Siempre que necesitemos guardar los cambios realizados, podemos guardarlos desde la sección &lt;em&gt;Cambios&lt;/em&gt; del &lt;em&gt;Team Explorer&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi58vr5d7qq33kten7bpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi58vr5d7qq33kten7bpo.png" width="348" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y en la sección &lt;em&gt;Sincronizar&lt;/em&gt; es necesario confirmar los cambios de salida:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fubr8zl7u6vhhq146czny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fubr8zl7u6vhhq146czny.png" width="354" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con estos primeros pasos, nuestra aplicación con DotVVM y ASP.NET Core en Visual Studio 2019 ya se encuentra asociada a un repositorio en GitHub determinado. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 2: Crear un recurso App Service en Azure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para crear un recurso de tipo App Service en Azure, podemos dirigirnos al portal: &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;portal.azure.com/&lt;/a&gt; y luego buscar el servicio en el panel de la izquierda de Azure en donde se encuentran los recursos más utilizados de Azure o en la sección de búsqueda. En cualquiera de los dos escenarios, procedemos a crear el recurso y a la final tendremos algo como esto: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhclajkvr7nig402kzbuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhclajkvr7nig402kzbuw.png" width="728" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el cual, será necesario especificar el nombre del Web App, el entorno de ejecución, que en este caso es .NET Core y su última versión la 3.1 (Julio 2020). Asimismo, es necesario especificar el sistema operativo sobre el cual se desplegará la aplicación. &lt;/p&gt;

&lt;p&gt;El proceso de creación tomará unos cuantos segundos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feywi3kowkdtu2vb6u313.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feywi3kowkdtu2vb6u313.png" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego debemos dirigirnos al recurso en la sección general y en el menú de opciones en la sección &lt;em&gt;Obtener perfil de publicación&lt;/em&gt;, hacemos clic para descargar el archivo de publicación correspondiente. Este archivo nos permitirá establecer una acción en GitHub para el despliegue continuo, como veremos en la Parte 3.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhzxejwipb9px8hhdifa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhzxejwipb9px8hhdifa.png" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 3: GitHub Actions para el despliegue continuo de aplicaciones en Azure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;En el entorno de GitHub, un flujo de trabajo es un proceso automatizado el cual es definido en un repositorio de GitHub. Este proceso indica a GitHub cómo crear e implementar un proyecto de aplicación de funciones en GitHub.&lt;/p&gt;

&lt;p&gt;Teniendo en cuenta estas consideraciones, GitHub Actions permite crear flujos de trabajo de ciclo de vida de software personalizados directamente en un repositorio GitHub. En este sentido, las acciones permiten crear, probar e implementar el código directamente desde GitHub. &lt;/p&gt;

&lt;p&gt;En nuestro caso de estudio, las acciones de GitHub nos permiten definir un flujo de trabajo para crear e implementar automáticamente el proyecto desarrollado con ASP.NET Core y DotVVM en la aplicación de funciones de Azure.&lt;/p&gt;

&lt;p&gt;Para crear este flujo de trabajo realizaremos estas actividades: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A. Configuración del secreto de GitHub&lt;/li&gt;
&lt;li&gt;B. Configurar un flujo de trabajo &lt;/li&gt;
&lt;li&gt;C. Implementación continua en acción &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para empezar, nos dirigiremos al repositorio de GitHub creado desde Visual Studio 2019 en la Parte 1. Con este repositorio realizaremos cada una de las actividades establecidas inicialmente.&lt;/p&gt;

&lt;h4&gt;
  
  
  A. Configuración del secreto de GitHub
&lt;/h4&gt;

&lt;p&gt;Dentro del repositorio en cuestión, en los menús de opciones nos dirigiremos a la ruta &lt;em&gt;Configuración &amp;gt; Secretos &amp;gt; Nuevo secreto&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftnznjlc5qbcvndw2kadb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftnznjlc5qbcvndw2kadb.png" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta sección especificaremos el nombre del secreto, en este caso será &lt;code&gt;SCM_CREDENTIALS&lt;/code&gt;, y el valor, el cual, corresponde al contenido del archivo de publicación descargado desde el recurso App Service en Azure, establecido en la Parte 2. Los campos tendrán un aspecto como este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F51zo8o4h170nn68ube3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F51zo8o4h170nn68ube3y.png" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente seleccionamos en &lt;em&gt;Agregar secreto&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F13me0m0ysxqp6fjgly14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F13me0m0ysxqp6fjgly14.png" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  B. Configurar un flujo de trabajo
&lt;/h4&gt;

&lt;p&gt;Ahora lo que realizaremos es configurar el flujo de trabajo que permitirá establecer la funcionalidad para la implementación continua hacia Azure. Para ello, dentro del repositorio, debemos dirigirnos en la sección de Actions y seleccionar en &lt;em&gt;set up a workflow yourself&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9z5qt2tkltpsyxfyeu12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9z5qt2tkltpsyxfyeu12.png" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Nota:&lt;/em&gt;&lt;/strong&gt; en esta sección de Actions también podemos encontrar flujos de trabajos ya establecidos para otro tipo de operaciones, por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0uhrkswkfaek3q3f31v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0uhrkswkfaek3q3f31v.png" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al intentar crear un flujo de trabajo por nuestra parte, un archivo &lt;em&gt;YAML (.yml)&lt;/em&gt; definirá este flujo en la ruta de acceso &lt;code&gt;/.github/workflows/&lt;/code&gt; del repositorio. En esta definición se incluyen los diversos pasos y parámetros que componen el flujo de trabajo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fctri8cdp9qbnmwys04np.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fctri8cdp9qbnmwys04np.png" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dicho esto, en este apartado es donde escribiremos el código fuente para el flujo de trabajo. El código final es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy&lt;/span&gt;
&lt;span class="c1"&gt;# More GitHub Actions for Azure: https://github.com/Azure/actions&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and deploy ASP.NET Core with DotVVM app to Azure&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-and-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;windows-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@master&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up .NET Core&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-dotnet@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;dotnet-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.1'&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build with dotnet&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet build --configuration Release&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet publish&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Azure Web App&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure/webapps-deploy@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;APP_NAME&amp;gt;'&lt;/span&gt;
        &lt;span class="na"&gt;slot-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production'&lt;/span&gt;
        &lt;span class="na"&gt;publish-profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets. SCM_CREDENTIALS }}&lt;/span&gt;
        &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{env.DOTNET_ROOT}}/myapp&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A continuación, veamos las partes mas importantes de este código. &lt;/p&gt;

&lt;p&gt;En la sección &lt;code&gt;name&lt;/code&gt; tenemos la definición del nombre de la acción. Podemos tener múltiples acciones en un mismo archivo y múltiples archivos en la carpeta &lt;code&gt;.github/workflows&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En el apartado on se define el disparador de la acción, el cual puede ser cualquier evento que desencadene flujos de trabajo, donde los más comunes son &lt;em&gt;push&lt;/em&gt; y &lt;em&gt;pull_request&lt;/em&gt;, pero existen muchos otros disparadores. En este caso, esa será la acción que indicará que un nuevo proceso de implementación continua deberá ser iniciado.&lt;/p&gt;

&lt;p&gt;Luego en &lt;code&gt;jobs&lt;/code&gt;, tenemos la definición de los trabajos. El nombre de este grupo se llama &lt;code&gt;build-and-deploy&lt;/code&gt;. Siguiendo con esta secuencia, Github actions define tres ambientes de ejecución para sus trabajos: &lt;code&gt;windows-latest&lt;/code&gt; , &lt;code&gt;ubuntu-latest&lt;/code&gt; y &lt;code&gt;macos-latest&lt;/code&gt; los cuales son definidos en el nodo &lt;code&gt;runs-on&lt;/code&gt; y ejecutan máquinas virtuales para la ejecución de las instrucciones subsiguientes. En este caso se ha definido como &lt;code&gt;windows-latest&lt;/code&gt;. Posteriormente, los pasos son definidos en la sección de &lt;code&gt;steps&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Como primer paso nos encontramos con la definición del tipo de flujo de trabajo, en este caso se utiliza &lt;code&gt;use&lt;/code&gt;, el cual permite integrar en nuestro flujo con acciones definidos por terceros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luego la versión ASP.NET Core es definida, en este caso, es necesario especificar en este apartado la versión de nuestro proyecto de ASP.NET Core con DotVVM. La versión en este ejemplo es la 3.1. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Posteriormente se realiza un build al proyecto en el paso &lt;code&gt;Build with dotnet&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Después, se preparan los archivos necesarios para el despliegue con &lt;code&gt;dotnet publish&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finalmente la implementación de estos archivos hacia Azure se lleva a cabo. En este caso, es necesario indicar el nombre del recurso App Service creado en Azure en el atributo &lt;code&gt;app-name&lt;/code&gt; y en &lt;code&gt;publish-profile&lt;/code&gt; se indica el nombre del secreto creado en el repositorio de GitHub, para este caso, el nombre establecido en la parte B fue &lt;code&gt;SCM_CREDENTIALS&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego guardamos el archivo &lt;em&gt;YAML&lt;/em&gt; y el flujo de trabajo estará listo para realizar la implementación continua cada vez que exista un cambio en el repositorio. &lt;/p&gt;

&lt;h4&gt;
  
  
  C. Implementación continua en acción
&lt;/h4&gt;

&lt;p&gt;Al realizar algún cambio dentro del repositorio o desde Visual Studio 2019, el flujo de trabajo se ejecutará. Desde el apartado &lt;em&gt;Actions&lt;/em&gt; en el repositorio de GitHub podemos ver como se realiza este proceso paso a paso, de acuerdo con los nombres y los pasos establecidos en el archivo YAML.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwoixk8v73zw9mnvsxdhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwoixk8v73zw9mnvsxdhe.png" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El resultado final de esta implementación es el siguiente: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxtnpxskgz4u36em876t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxtnpxskgz4u36em876t7.png" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;¿Qué sigue?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Con este articulo hemos aprendido paso a paso como implementar de forma continua aplicaciones web con ASP.NET Core y DotVVM a través de GitHub Actions.&lt;/p&gt;

&lt;p&gt;El código fuente del proyecto de muestra está disponible en el siguiente repositorio: &lt;a href="https://github.com/esdanielgomez/DotVVMcrud" rel="noopener noreferrer"&gt;DotVVM Sample CRUD&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;A continuación, se listan algunos recursos adicionales que podrían ser de tu interés para seguir adquiriendo nuevos conocimientos en esta área:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curso gratuito y abierto en YouTube: &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;Fundamentos de ASP.NET Core y DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe"&gt;DotVVM y ASP.NET Core: Implementación de operaciones CRUD&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/trabajando-con-servicios-web-a-traves-de-asp-net-core-y-dotvvm-4c76"&gt;Trabajando con servicios web a través de ASP.NET Core y DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gracias:
&lt;/h4&gt;

&lt;p&gt;Si tienes alguna inquietud o necesitas ayuda en algo particular, será un gusto poder ayudar.&lt;/p&gt;

&lt;p&gt;Nos vemos en &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

&lt;p&gt;¡Hasta pronto!&lt;/p&gt;

</description>
      <category>github</category>
      <category>azure</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Página web para el informe de datos con DotVVM Business Pack</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Thu, 06 Aug 2020 09:26:06 +0000</pubDate>
      <link>https://forem.com/dotvvm/pagina-web-para-el-informe-de-datos-con-dotvvm-business-pack-593b</link>
      <guid>https://forem.com/dotvvm/pagina-web-para-el-informe-de-datos-con-dotvvm-business-pack-593b</guid>
      <description>&lt;p&gt;En muchas ocasiones cuando trabajamos con sistemas que tienen como objetivo realizar operaciones sobre una base de datos, existe la necesidad de incluir una sección dentro de estos sistemas para visualizar los datos correspondientes. Dentro de las páginas web, normalmente se emplean tablas para representar a la información, secciones de búsqueda para filtrar la información, entre otros elementos. &lt;/p&gt;

&lt;p&gt;En este articulo aprenderemos como diseñar de una manera sencilla, una página web para visualizar ciertos datos alojados en tablas de una base de datos relaciona a través de ASP.NET Core y DotVVM. En artículos anteriores, pudimos aprender de manera general como utilizar controles predefinidos de DotVVM para la visualización de datos a manera de reporte. Estos son algunos de esos artículos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe"&gt;DotVVM y ASP.NET Core: Implementación de operaciones CRUD&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/trabajando-con-asp-net-core-y-dotvvm-en-visual-studio-code-586l"&gt;Trabajando con ASP.NET Core y DotVVM en Visual Studio Code&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asimismo, cuando se manejan formularios para administrar información, es necesario crear tablas para poder visualizar los datos tratados. Estos son algunos artículos previos por si deseas aprender como diseñar formularios con HTML con DotVVM: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/creacion-de-formularios-para-paginas-web-con-los-controles-de-dotvvm-5eoi"&gt;Creación de formularios para páginas web con los controles de DotVVM&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/diseno-de-formularios-web-con-dotvvm-business-pack-43mm"&gt;Diseño de formularios web con DotVVM Business Pack&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/diseno-de-formularios-web-con-bootstrap-para-dotvvm-desde-asp-net-core-5ddc"&gt;Diseño de formularios web con Bootstrap para DotVVM desde ASP.NET Core&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En esta ocasión aprenderemos los fundamentos para visualizar determinados datos y establecer algunos criterios de búsqueda con C# y HTML, a través de los controles premium de DotVVM sobre ASP.NET Core, denominados como DotVVM Business Pack. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota&lt;/em&gt;: el código fuente del proyecto que analizaremos en este articulo lo puedes encontrar en este repositorio de GitHub: &lt;a href="https://github.com/esdanielgomez/DotVVMReportsBusinessPack" rel="noopener noreferrer"&gt;Reports in DotVVM with Business Pack controls&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  El patrón de diseño Modelo, Vista, Vistamodelo - MVVM
&lt;/h4&gt;

&lt;p&gt;DotVVM se fundamenta en el patrón de diseño Modelo, Vista, Vistamodelo sobre .NET para la comunicación entre HTML (páginas web) y C# (código fuente). La finalidad de estas partes son las siguientes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;El modelo.&lt;/strong&gt; — es responsable de todos los datos de la aplicación y de la lógica de negocios relacionada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La vista.&lt;/strong&gt; — Representaciones para el usuario final del modelo de la aplicación. La vista es responsable de mostrar los datos al usuario y de permitir la manipulación de los datos de la aplicación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modelo-Vista o Vista-Modelo.&lt;/strong&gt; — uno o más por vista; el modelo-vista es responsable de implementar el comportamiento de la vista para responder a las acciones del usuario y de exponer los datos del modelo fácilmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ¿Cómo se puede acceder a DotVVM Business Pack?
&lt;/h4&gt;

&lt;p&gt;Business Pack es un NuGet privado, en el cual, podemos hacer uso de los competentes premium ya establecidos por DotVVM para la construcción de aplicaciones web en el ámbito empresarial. &lt;/p&gt;

&lt;p&gt;Para la instalación de la versión Business Pack de DotVVM, es necesario realizar una configuración de unos pocos minutos para poder emplear estas funcionalidades. Todo se resume en lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instalar la extensión de DotVVM para Visual Studio 2019. &lt;/li&gt;
&lt;li&gt;Adquirir Business Pack (existe la versión de prueba) en la siguiente dirección: &lt;a href="https://www.dotvvm.com/products/dotvvm-business-pack" rel="noopener noreferrer"&gt;DotVVM Business Pack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Iniciar sesión en la extensión de DotVVM para Visual Studio 2019. Para ello, podemos dirigirnos al menú de opciones de Visual Studio en la ruta: Extensiones -&amp;gt; DotVVM -&amp;gt; About. Y listo, eso será todo. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffyqai7lsivp5hzrzri0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffyqai7lsivp5hzrzri0r.png" width="636" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Reporte con ASP.NET Core y DotVVM&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para ejemplificar la utilización de algunos controles Business Pack de DotVVM para la realización de un reporte, tendemos una pequeña aplicación como esta: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu0nk4plhsfzoajxhybim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu0nk4plhsfzoajxhybim.png" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk9sjrfpojq60puiumtas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fk9sjrfpojq60puiumtas.png" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teniendo en cuenta el patrón MVVM – Modelo, Vista, Vistamodelo, analizaremos de forma general cada una de estas partes para este proyecto, que tiene como objetivo mostrar los datos de usuarios determinados. &lt;/p&gt;

&lt;h4&gt;
  
  
  Modelo
&lt;/h4&gt;

&lt;p&gt;Los datos de la aplicación y de la lógica de negocios relacionada se maneja en esta sección. En este sentido, vamos a ver cómo se manejan los datos y los servicios correspondientes. &lt;/p&gt;

&lt;p&gt;La base de datos está conformada por dos tablas: &lt;em&gt;Person&lt;/em&gt; y &lt;em&gt;PersonType&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmkyuk0nqianq04z5v6cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmkyuk0nqianq04z5v6cr.png" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las sentencias SQL para la creación de estas tablas, sus atributos y la inserción de algunos registros son las siguientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="nb"&gt;CHARACTER&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`PersonType`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nv"&gt;`Id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`Name`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`Description`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`Person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nv"&gt;`Id`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`FirstName`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`LastName`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;`dbperson`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`PersonType`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`persontype`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Description`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Type A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`persontype`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Description`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Type B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sergey'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Brin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Larry'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Page'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Barners'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Linus'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Torvalds'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Larry'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ellison'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'6'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ballmer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'7'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Jobs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'8'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Marc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Benioff'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ray'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ozzie'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Nicholas'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Negroponte'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Diane'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Green'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Sam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Palmisano'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'13'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Blake'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ross'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'14'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ralph'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Szygenda'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`person`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`FirstName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`LastName`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`IdPersonType`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'15'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Rick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Dalzell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con la base de datos establecida, la parte correspondiente a la capa de acceso de datos hace referencia a la definición de las clases para trabajar con las entidades de la base de datos y al contexto para establecer la comunicación entre ASP.NET Core y la base de datos, que, en este caso, MySQL es la que se esta utilizando. &lt;/p&gt;

&lt;p&gt;Para este propósito, es necesario instalar tres paquetes NuGet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Design&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.EntityFrameworkCore.Tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MySql.Data.EntityFrameworkCore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En caso de que se esté trabajando con SQL Server, el paquete NuGet a instalar será: &lt;code&gt;Microsoft.EntityFrameworkCore.SQLServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Posteriormente, es necesario utilizar la consola de administración de paquetes para realizar scaffolding desde la base de datos (generar automáticamente el contexto y las clases de las entidades) a través del siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scaffold-DbContext "server=servername;port=portnumber;user=username;password=pass;database=databasename" MySql.Data.EntityFrameworkCore -OutputDir Entities -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esta primera parte, la conexión a la base de datos esta lista. Lo que prosigue a continuación es la definición de modelos con los cuales se trabajará en la página web. Estos modelos son:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NamePersonType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonTypeModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cada uno de estos modelos se cuenta con un servicio, los cuales tienen las siguientes operaciones: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PersonService&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonsAsync()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonByIdAsync(int personId)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonByIdAndTypeAsync(int personId, int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonsByTypeAsync(int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PersonTypeService&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetAllPersonTypesAsync()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetPersonTypeByIdAsync(int personTypeId)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En Visual Studio 2019 tendremos algo como esto: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmobwig7nrjcfg4etc10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmobwig7nrjcfg4etc10.png" width="366" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Vistamodelo
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DefaultViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MasterPageViewModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;PersonService&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;BusinessPackDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Persons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BusinessPackDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;IdSearch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsWindowDisplayed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DefaultViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonService&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;personService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;UpdatePersonList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;IdSearch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsByTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;SearchByTextVisible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;SearchById&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonByIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonByIdAndTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdSearch&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;IdPersonType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PersonTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;personService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAllPersonsByTypeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IdPersonType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Vista
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dot:Content&lt;/span&gt; &lt;span class="na"&gt;ContentPlaceHolderID=&lt;/span&gt;&lt;span class="s"&gt;"MainContent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/tree.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__background-image content__background-image--left"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.dotvvm.com/"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/text.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__image"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;PERSON REPORT FORM&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"~/icon.png"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"15%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"15%"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;bp:Window&lt;/span&gt; &lt;span class="na"&gt;IsDisplayed=&lt;/span&gt;&lt;span class="s"&gt;"{value: IsWindowDisplayed}"&lt;/span&gt;
                       &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Reporting form"&lt;/span&gt;
                       &lt;span class="na"&gt;CloseOnEscape=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
                       &lt;span class="na"&gt;CloseOnOutsideClick=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Person report&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Search by type:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                             &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                             &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 1}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type A"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                             &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                             &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 2}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type B"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Search by text:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                ID Number:
                &lt;span class="nt"&gt;&amp;lt;bp:TextBox&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: IdSearch}"&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Number"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt; &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: SearchById()}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-button"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Report:&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;bp:GridView&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"{value: Persons}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Columns&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Id}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: FirstName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Firstname"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: LastName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"LastName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: NamePersonType}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Type"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/Columns&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;EmptyDataTemplate&amp;gt;&lt;/span&gt;
                        There are no search results.
                    &lt;span class="nt"&gt;&amp;lt;/EmptyDataTemplate&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/bp:GridView&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;/bp:Window&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"LOAD REPORT"&lt;/span&gt;
                       &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: IsWindowDisplayed = true}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/Resources/Images/tree.svg"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content__background-image content__background-image content__background-image--right"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dot:Content&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Análisis de la aplicación&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;En el siguiente GIF se puede visualizar de manera general la interacción con esta pequeña página web. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0809dabdz1rjleuv7fm2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0809dabdz1rjleuv7fm2.gif" width="1660" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El primer elemento que analizaremos es el componente &lt;code&gt;Window&lt;/code&gt;, el cual, representa a una ventana de diálogo de tipo modal, como en HTML. Este control nos permite personalizar directamente desde sus atributos como se visualizará la ventana. Si estuviésemos trabajando con los controles base de DotVVM, para lograr esta funcionalidad tendríamos que hacer uso de algunas funcionalidades de Javascript directamente para establecer la ventana. En este ejemplo, el título de la ventana se puede asignar. Asimismo, se pueden personalizar ciertas propiedades, por ejemplo, no permitir que la ventana se cierre al presionar la tecla Escape o dar clic fuera del recuadro de la ventana.&lt;/p&gt;

&lt;p&gt;En este ejemplo, el atributo booleano &lt;code&gt;IsWindowDisplayed&lt;/code&gt;, de acuerdo con su valor &lt;code&gt;true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt;, permitirá visualizar o no la ventana establecida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:Window&lt;/span&gt; &lt;span class="na"&gt;IsDisplayed=&lt;/span&gt;&lt;span class="s"&gt;"{value: IsWindowDisplayed}"&lt;/span&gt;
            &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Reporting form"&lt;/span&gt;
            &lt;span class="na"&gt;CloseOnEscape=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
            &lt;span class="na"&gt;CloseOnOutsideClick=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta es la definición del atributo &lt;code&gt;IsWindowDisplayed&lt;/code&gt; para la visualización de la ventana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsWindowDisplayed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para mostrar la ventana, se hace uso de un botón. Este botón también es otro de los componentes Business Pack. La versión premium permite realizar ciertas personalizaciones en cuanto a sus estilos, por ejemplo, activar/desactivar el botón, asignar un icono, entre otras funcionalidades: &lt;a href="https://www.dotvvm.com/docs/controls/businesspack/Button/2.0" rel="noopener noreferrer"&gt;Button/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;El resultado es el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnuzuyipzui2i1rccfyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnuzuyipzui2i1rccfyo.png" width="742" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro de esta ventana, el elemento mas importante corresponde a la tabla que permite listar a los usuarios registrados en la base de datos. Para este objetivo se utiliza el elemento &lt;code&gt;GridView&lt;/code&gt;, otro control de DotVVM que nos permite crear tablas para representar datos en específico. Como parte principal, el control nos permite indicar la fuente de datos a través de la propiedad &lt;code&gt;DataSource&lt;/code&gt;, en este caso, la fuente de datos se define de la siguiente manera en el Viewmodel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GridViewDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Persons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GridViewDataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PersonModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para la definición de las columnas se utiliza la etiqueta &lt;code&gt;GridViewTextColumn&lt;/code&gt;. En este caso, podemos encontrar las columnas &lt;em&gt;Id&lt;/em&gt;, &lt;em&gt;FirstName&lt;/em&gt;, &lt;em&gt;LastName&lt;/em&gt; y &lt;em&gt;Type&lt;/em&gt;. Estos nombres vienen del tipo de dato de la fuente de datos, en este caso, del modelo &lt;code&gt;PersonModel&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:GridView&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"{value: Persons}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Columns&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Id}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: FirstName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Firstname"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: LastName}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"LastName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bp:GridViewTextColumn&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: NamePersonType}"&lt;/span&gt; &lt;span class="na"&gt;HeaderText=&lt;/span&gt;&lt;span class="s"&gt;"Type"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Columns&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;EmptyDataTemplate&amp;gt;&lt;/span&gt;
        There are no search results.
    &lt;span class="nt"&gt;&amp;lt;/EmptyDataTemplate&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bp:GridView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una de las sub-etiquetas de &lt;code&gt;GridView&lt;/code&gt; es &lt;code&gt;EmptyDataTemplate&lt;/code&gt;, la cual está incluida también en los controles base de DotVVM. Esta etiqueta permite mostrar algún contenido HTML en caso de que el listado de elementos se encuentre vacío. A la final, con &lt;code&gt;GridView&lt;/code&gt; visualizaremos algo como esto: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fipigzzjdzca3vhzgz3pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fipigzzjdzca3vhzgz3pm.png" width="631" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Más información sobre el componente &lt;code&gt;GridView&lt;/code&gt; aquí: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/GridView/2.0" rel="noopener noreferrer"&gt;GridView/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muy bien, con esta tabla tenemos la parte más importante del reporte. A partir de esto, podemos agregar componentes adicionales para establecer criterios de búsqueda por ejemplo y actualizar esta tabla según la búsqueda. &lt;/p&gt;

&lt;p&gt;El primer caso es utilizando la versión premium del control &lt;code&gt;CheckBox&lt;/code&gt; de DotVVM. Al igual que en HTML o cualquier otro entorno de diseño, el &lt;code&gt;CheckBox&lt;/code&gt; tiene el rol como casilla de verificación para seleccionar elementos en un conjunto de opciones. Para este ejemplo, el objetivo es tener dos casillas de verificación, los cuales corresponden a los tipos de personas. Según la selección, ya sea del tipo A, del tipo B, o de los dos, la tabla de registros se actualizará de acuerdo con esta decisión. &lt;/p&gt;

&lt;p&gt;En la parte de la vista, nos encontramos con la propiedad &lt;code&gt;CheckedItems&lt;/code&gt; que almacenara el valor de los elementos que se encuentren seleccionados. Asimismo, nos encontramos con la propiedad &lt;code&gt;Changed&lt;/code&gt;, la cual permite especificar el método que realizara las acciones al momento que este elemento sea activado o desactivado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 1}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type A"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;bp:CheckBox&lt;/span&gt; &lt;span class="na"&gt;CheckedItems=&lt;/span&gt;&lt;span class="s"&gt;"{value: PersonTypes}"&lt;/span&gt;
                &lt;span class="na"&gt;Changed=&lt;/span&gt;&lt;span class="s"&gt;"{command: UpdatePersonList()}"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"{value: 2}"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Type B"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el método de actualización de los registros de la tabla, si seleccionados uno de los dos tipos, entonces realizaremos una consulta en la base de datos de acuerdo con el servicio definido: &lt;code&gt;PersonService&lt;/code&gt;, para obtener el listado de personas según el id seleccionado. Con este listado recuperado, actualizaremos la base de datos al establecer nuevamente los ítems de la fuente de datos del &lt;code&gt;GridView&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vimos en el GIF, el resultado de utilizar el control &lt;code&gt;CheckBox&lt;/code&gt; es el siguiente: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1xmxvik11tnov5t9vk1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1xmxvik11tnov5t9vk1y.png" width="218" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Más información sobre el componente CheckBox aquí: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/CheckBox/2.0" rel="noopener noreferrer"&gt;CheckBox/2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Otro de los controles que nos permiten seguir agregando funcionalidades al GridView para establecer criterios de búsqueda a este reporte son los elementos &lt;code&gt;TextBox&lt;/code&gt; y &lt;code&gt;Button&lt;/code&gt;. En este caso, estos componentes pueden ser de utilizad para buscar algún elemento específico del reporte a través de una entrada de texto. Para ejemplificar el uso de estos elementos en la aplicación, los controles sirven para encontrar a una persona especifica según su Id.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;ID Number:

&lt;span class="nt"&gt;&amp;lt;bp:TextBox&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: IdSearch}"&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Number"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;bp:Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt; &lt;span class="na"&gt;Click=&lt;/span&gt;&lt;span class="s"&gt;"{command: SearchById()}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-button"&lt;/span&gt; &lt;span class="na"&gt;Visible=&lt;/span&gt;&lt;span class="s"&gt;"{value: SearchByTextVisible}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La actualización de los elementos del &lt;code&gt;GridView&lt;/code&gt; es similar al caso del &lt;code&gt;CheckBox&lt;/code&gt;. El resultado es el siguiente: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tus4wg8m0jebtjf17mq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9tus4wg8m0jebtjf17mq.png" width="636" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Toda la información sobre el control TextBox la podemos encontrar en: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/TextBox/2.0" rel="noopener noreferrer"&gt;TextBox/2.0&lt;/a&gt;. Y la del control Button en: &lt;a href="https://www.dotvvm.com/docs/controls/builtin/Button/2.0" rel="noopener noreferrer"&gt;Button/2.0&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;¿Qué sigue?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Con este artículo, hemos aprendido ciertas características de los componentes &lt;code&gt;Windows&lt;/code&gt;, &lt;code&gt;GridView&lt;/code&gt;, &lt;code&gt;CheckBox&lt;/code&gt;, &lt;code&gt;TextBox&lt;/code&gt; y &lt;code&gt;Button&lt;/code&gt; del conjunto de controles Business Pack de DotVVM para visualizar un listado de datos y establecer criterios de búsqueda a través del patrón de diseño Modelo, Vista, Vistamodelo en ASP.NET Core y DotVVM. &lt;/p&gt;

&lt;p&gt;El código fuente de esta implementación está disponible en este repositorio: &lt;a href="https://github.com/esdanielgomez/DotVVMReportsBusinessPack" rel="noopener noreferrer"&gt;Reports in DotVVM with Business Pack controls&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Recursos adicionales
&lt;/h4&gt;

&lt;p&gt;Deseas seguir adquiriendo nuevos conocimientos sobre ASP.NET Core y DotVVM, estos recursos podrían ser de tu interés:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curso gratuito y abierto en YouTube: &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;Fundamentos de ASP.NET Core y DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe"&gt;DotVVM y ASP.NET Core: Implementación de operaciones CRUD&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/trabajando-con-servicios-web-a-traves-de-asp-net-core-y-dotvvm-4c76"&gt;Trabajando con servicios web a través de ASP.NET Core y DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gracias:
&lt;/h4&gt;

&lt;p&gt;Si tienes alguna inquietud o necesitas ayuda en algo particular, será un gusto poder ayudar. &lt;/p&gt;

&lt;p&gt;Nos vemos en &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

&lt;p&gt;¡Hasta pronto! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>dotnet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GitHub Actions + Azure: Continuous deployment of ASP.NET Core with DotVVM applications</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Mon, 03 Aug 2020 21:07:51 +0000</pubDate>
      <link>https://forem.com/dotvvm/github-actions-azure-continuous-deployment-of-asp-net-core-with-dotvvm-applications-1i3l</link>
      <guid>https://forem.com/dotvvm/github-actions-azure-continuous-deployment-of-asp-net-core-with-dotvvm-applications-1i3l</guid>
      <description>&lt;p&gt;In the world of software development, words such as continuous implementation are always present. In this case, continuous deployment is a strategy for software versions, so that any code commit that passes the testing phase automatically is released in a production environment, deploying changes that are visible to users of the software in question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu33zv2mw7ea0fwuult2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu33zv2mw7ea0fwuult2.png" width="388" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a small variation of continuous delivery because if you had to perform a manual deployment before, here in (CD) simply for each merge to the master branch is proceeded to perform a deployment automatically, the process remains as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change Control (Source Control)&lt;/li&gt;
&lt;li&gt;Build and Tests&lt;/li&gt;
&lt;li&gt;Staging (Staging)&lt;/li&gt;
&lt;li&gt;Deploy to Production: Latest version running on the main website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taking these considerations into account, with continuous deployment, the entire process from code commit to production is automated. The trigger between the development and delivery phases is automatic, so code changes are pushed live once they receive validation and pass all tests. This means that users receive improvements as soon as they are available.&lt;/p&gt;

&lt;p&gt;In this tutorial article, we'll learn step-by-step the process of continuously deploying a web application developed with DotVVM through ASP.NET Core to publish it automatically and continuously to an Azure App Service resource, using GitHub Actions. &lt;/p&gt;

&lt;p&gt;In relation to GitHub Actions, this is a functionality that allows us to create workflows that can be used to compile, test and deploy code, giving the possibility to create integration flows and continuous deployment within the GitHub repository itself as we will see later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activities&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;To carry out continuous deployment activities, we have three important parts within this process: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 1: Associate the project in question from Visual Studio 2019 with a repository on GitHub.&lt;/li&gt;
&lt;li&gt;Part 2: Create an App Service resource in Azure. &lt;/li&gt;
&lt;li&gt;Part 3: Configure deployment actions to Azure in the GitHub repository. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Required Resources&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;To follow this article step by step, you need to have these tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET Core SDK.&lt;/li&gt;
&lt;li&gt;Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;Workload: Web Development and ASP.NET, for Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;The DotVVM extension for Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;A GitHub account. &lt;/li&gt;
&lt;li&gt;An Azure subscription.&lt;/li&gt;
&lt;li&gt;If the project is associated with a database, it must be hosted in the cloud.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The solution environment&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Projects for application development with ASP.NET Core and DotVVM are based on the Model, View, View model pattern; for communication between HTML (web pages) and C# (source code). The purpose of these parts are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model.&lt;/strong&gt; — is responsible for all application data and related business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The view.&lt;/strong&gt; — Representations for the end-user of the application model. The view is responsible for displaying the data to the user and allowing manipulation of application data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-View or View-Model.&lt;/strong&gt; — one or more per view; the model-view is responsible for implementing view behavior to respond to user actions and for easily exposing model data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, there are three projects for this purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DAL (Data Access Layer):&lt;/strong&gt; to manage database connection and access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BL (Business Layer):&lt;/strong&gt; for the handling of services and application domain logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APP - Application Presentation Layer.&lt;/strong&gt; This section is where we have Views and Viewmodels for designing web pages with DotVVM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution in Visual Studio 2019 looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnau9uj1rjh3xdpggcafb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnau9uj1rjh3xdpggcafb.png" width="438" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to know the steps to create a DotVVM app? To do this you can review this article: &lt;a href="https://dev.to/esdanielgomez/steps-to-create-an-mvvm-application-model-view-view-model-with-dotvvm-and-asp-net-core-fm2"&gt;Steps to create an MVVM application (Model-View-ViewModel) with DotVVM and ASP.NET Core&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 1: Associate the project from Visual Studio 2019 with a repository on GitHub&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The first thing to do is to verify that we have the GitHub extension installed for Visual Studio 2019. To do this we can go to the options menu in the &lt;em&gt;Extensions&lt;/em&gt; section and select the &lt;em&gt;Manage Extensions&lt;/em&gt; option. In this box, we can perform the verification.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7s11k9cezkbtg7n4vajh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7s11k9cezkbtg7n4vajh.png" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you do not have the GitHub extension for Visual Studio 2019, the installer can be found at the following address: &lt;a href="https://visualstudio.github.com/" rel="noopener noreferrer"&gt;visualstudio.github.com/&lt;/a&gt;. To add the extension, Visual Studio must be closed as they are changes to the Microsoft IDE that are made during installation.&lt;/p&gt;

&lt;p&gt;Now, we proceed to associate with the solution that contains the three projects (.APP, .BL and . DAL) to a repository on GitHub, to do this, right-click on the Visual Studio solution and select &lt;code&gt;Add Solution to Source Control&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmgacjdvf97xwrn0z1v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmgacjdvf97xwrn0z1v2.png" width="420" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later we went to the &lt;em&gt;Team Explorer&lt;/em&gt; view and connected our GitHub account to Visual Studio in the &lt;em&gt;Connect&lt;/em&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu1l16b6a9biuqj1yh8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu1l16b6a9biuqj1yh8c.png" width="352" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we go to the &lt;em&gt;Team Explorer&lt;/em&gt; option: &lt;em&gt;Synchronization&lt;/em&gt;: select &lt;em&gt;Publish to GitHub&lt;/em&gt; and continue with the instructions presented for creating a new repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi5zjuajjsittrbwx5tta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi5zjuajjsittrbwx5tta.png" width="761" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A short time later, our project will be associated with the repository we just created. We can check this directly from GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpygk6bm602buwu3dri4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpygk6bm602buwu3dri4q.png" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Whenever we need to save our changes, we can save them from the &lt;em&gt;Changes&lt;/em&gt; section of &lt;em&gt;Team Explorer&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi58vr5d7qq33kten7bpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi58vr5d7qq33kten7bpo.png" width="348" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And in the &lt;em&gt;Sync&lt;/em&gt; section we need to confirm the output changes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fubr8zl7u6vhhq146czny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fubr8zl7u6vhhq146czny.png" width="354" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With these first steps, our application with DotVVM and ASP.NET Core in Visual Studio 2019 is already associated with a particular GitHub repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 2: Create an App Service resource in Azure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To create an App Service-type resource in Azure, we can go to the portal: &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;portal.azure.com/&lt;/a&gt; and then search for the service in the left pane of Azure where the most commonly used Azure resources are located or in the search section. In either scenario, we proceed to create the resource and to the end, we will have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhclajkvr7nig402kzbuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhclajkvr7nig402kzbuw.png" width="728" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In which, we will need to specify the name of the Web App, the runtime environment, which in this case is .NET Core and its latest version 3.1 (August 2020). We also need to specify the operating system on which the application will be deployed.&lt;/p&gt;

&lt;p&gt;The creation process will take a few seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feywi3kowkdtu2vb6u313.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feywi3kowkdtu2vb6u313.png" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we should go to the resource in the general section and in the options menu in the &lt;em&gt;Get Post Profile&lt;/em&gt; section, click to download the corresponding publishing file. This file will allow us to set action on GitHub for continuous deployment, as we'll see in Part 3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhzxejwipb9px8hhdifa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhzxejwipb9px8hhdifa.png" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 3: GitHub Actions for continuous deployment of applications in Azure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the GitHub environment, a workflow is an automated process that is defined in a GitHub repository. This process tells GitHub how to create and deploy a function app project on GitHub.&lt;/p&gt;

&lt;p&gt;With these considerations in mind, GitHub Actions enables us to create custom software lifecycle workflows directly in a GitHub repository. In this sense, actions allow us to create, test, and deploy our code directly from GitHub. &lt;/p&gt;

&lt;p&gt;In our case study, GitHub actions allow us to define a workflow to automatically create and deploy the project developed with ASP.NET Core and DotVVM in the Azure function application.&lt;/p&gt;

&lt;p&gt;To create this workflow we will perform these activities: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A. GitHub Secret Settings&lt;/li&gt;
&lt;li&gt;B. Set up a workflow &lt;/li&gt;
&lt;li&gt;C. Continuous implementation in action &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get started, we'll head to the GitHub repository created from Visual Studio 2019 in Part 1. With this repository, we will perform each of the activities initially established.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Setting up GitHub's secret
&lt;/h3&gt;

&lt;p&gt;Within the repository in question, in the options menus we will go to the path &lt;em&gt;Settings &amp;gt; Secrets &amp;gt; New secret&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftnznjlc5qbcvndw2kadb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftnznjlc5qbcvndw2kadb.png" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this section we will specify the name of the secret, in this case, it will be &lt;code&gt;SCM_CREDENTIALS&lt;/code&gt;, and the value, which corresponds to the content of the publish file downloaded from the App Service resource in Azure, set out in Part 2. The fields will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F51zo8o4h170nn68ube3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F51zo8o4h170nn68ube3y.png" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, select in &lt;em&gt;Add secret&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F13me0m0ysxqp6fjgly14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F13me0m0ysxqp6fjgly14.png" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  B. Set up a workflow
&lt;/h4&gt;

&lt;p&gt;Now what we'll do is configure the workflow that will allow us to set the functionality for continuous deployment to Azure. To do this, within the repository, we need to go to the Actions section and select in &lt;em&gt;set up a workflow yourself&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9z5qt2tkltpsyxfyeu12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9z5qt2tkltpsyxfyeu12.png" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; in this Actions section we can also find workflows already established for other types of operations, for example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0uhrkswkfaek3q3f31v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq0uhrkswkfaek3q3f31v.png" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When attempting to create a workflow on our part, a &lt;em&gt;YAML (.yml)&lt;/em&gt; file will define this flow in the repository path &lt;code&gt;/.github/workflows/&lt;/code&gt;. This definition includes the various steps and parameters that make up the workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fctri8cdp9qbnmwys04np.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fctri8cdp9qbnmwys04np.png" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That said, this section is where we'll write the source code for the workflow. The final code is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy&lt;/span&gt;
&lt;span class="c1"&gt;# More GitHub Actions for Azure: https://github.com/Azure/actions&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and deploy ASP.NET Core with DotVVM app to Azure&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-and-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;windows-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@master&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up .NET Core&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-dotnet@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;dotnet-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.1'&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build with dotnet&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet build --configuration Release&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet publish&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Azure Web App&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure/webapps-deploy@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;APP_NAME&amp;gt;'&lt;/span&gt;
        &lt;span class="na"&gt;slot-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production'&lt;/span&gt;
        &lt;span class="na"&gt;publish-profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets. SCM_CREDENTIALS }}&lt;/span&gt;
        &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{env.DOTNET_ROOT}}/myapp&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let's look at the most important parts of this code. &lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;name&lt;/code&gt; section we have the definition of the action name. We can have multiple actions in the same file and multiple files in the folder &lt;code&gt;.github/workflows&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The action trigger is defined in the on section, which can be any event that triggers workflows, where the most common ones are &lt;em&gt;push&lt;/em&gt; and &lt;em&gt;pull_request&lt;/em&gt;, but there are many other triggers. In this case, that will be the action that will indicate that a new continuous deployment process should be initiated.&lt;/p&gt;

&lt;p&gt;Then in &lt;code&gt;jobs&lt;/code&gt;, we have the definition of jobs. The name of this group is called &lt;code&gt;build-and-deploy&lt;/code&gt;. Continuing with this sequence, Github's actions define three execution environments for its jobs: &lt;code&gt;windows-latest&lt;/code&gt;, &lt;code&gt;ubuntu-latest&lt;/code&gt;, and &lt;code&gt;macos-latest&lt;/code&gt; which are defined in the &lt;code&gt;runs-on&lt;/code&gt; node and run virtual machines for the execution of subsequent statements. In this case, it has been set to &lt;code&gt;windows-latest&lt;/code&gt;. The steps are then defined in the &lt;code&gt;steps&lt;/code&gt; section:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As a first step, we find the definition of the type of workflow, in this case, &lt;code&gt;use&lt;/code&gt; is used, which allows us to integrate into our flow with actions defined by third parties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then the version ASP.NET Core is defined, in this case, it is necessary to specify in this section the version of our ASP.NET Core project with DotVVM. The version in this example is 3.1. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The project is then built in the &lt;code&gt;Build with dotnet&lt;/code&gt; step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then the necessary files are prepared for deployment with &lt;code&gt;dotnet publish&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, the deployment of these files to Azure takes place. In this case, it is necessary to indicate the name of the App Service resource created in Azure in the attribute &lt;code&gt;app-name&lt;/code&gt; and in &lt;code&gt;publish-profile&lt;/code&gt; the name of the secret created in the GitHub repository is indicated, for this case, the name set in part B was &lt;code&gt;SCM_CREDENTIALS&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then we save the &lt;em&gt;YAML&lt;/em&gt; file and the workflow will be ready to perform continuous deployment whenever there is a change in the repository. &lt;/p&gt;

&lt;h3&gt;
  
  
  C. Continuous implementation in action
&lt;/h3&gt;

&lt;p&gt;When we make any changes within the repository or from Visual Studio 2019, the workflow will run. From the &lt;em&gt;Actions&lt;/em&gt; section in the GitHub repository we can see how this process is done step by step, according to the names and steps set in the YAML file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwoixk8v73zw9mnvsxdhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwoixk8v73zw9mnvsxdhe.png" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The end result of this implementation is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxtnpxskgz4u36em876t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxtnpxskgz4u36em876t7.png" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What's next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With this article, we have learned step by step how to continuously deploy web applications with ASP.NET Core and DotVVM through GitHub Actions.&lt;/p&gt;

&lt;p&gt;The sample project source code is available in the following repository: &lt;a href="https://github.com/esdanielgomez/DotVVMcrud" rel="noopener noreferrer"&gt;DotVVM Sample CRUD&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Here are some additional resources that might be of interest to you to continue to gain new knowledge in this area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free and open course on YouTube (Spanish): &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;ASP.NET Core and DotVVM Fundamentals&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/esdanielgomez/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD Operations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Thank you:
&lt;/h4&gt;

&lt;p&gt;If you have any concerns or need help in something particular, it will be a pleasure to be able to collaborate.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

</description>
      <category>github</category>
      <category>azure</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Implementación de aplicaciones web con ASP.NET Core y DotVVM en AWS Elastic Beanstalk</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Fri, 24 Jul 2020 19:27:10 +0000</pubDate>
      <link>https://forem.com/dotvvm/implementacion-de-aplicaciones-web-con-asp-net-core-y-dotvvm-en-aws-elastic-beanstalk-1ceg</link>
      <guid>https://forem.com/dotvvm/implementacion-de-aplicaciones-web-con-asp-net-core-y-dotvvm-en-aws-elastic-beanstalk-1ceg</guid>
      <description>&lt;p&gt;Hoy en día, la computación en la nube es tendencia en el mundo tecnológico, debido a su impacto al generar servicios y soluciones informáticas para usuarios y empresas. Si nos centramos en el área del desarrollo de software a través de ASP.NET por ejemplo, una de las relaciones directas con la nube es el poder desplegar estas aplicaciones. &lt;/p&gt;

&lt;p&gt;En este articulo aprenderemos como desplegar sitos web en la nube, específicamente con DotVVM sobre ASP.NET Core 3.1 hacia Amazon Web Services, bajo un enfoque de &lt;em&gt;Plataforma como Servicio – PaaS&lt;/em&gt;. Si recordamos este enfoque dentro de los tipos de servicios en la nube, hacemos referencia a un entorno de desarrollo y de implementación, sin preocuparnos de la administración de los recursos de infraestructura tecnológica. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actividades:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para llevar a cabo las actividades de despliegue sobre AWS, tendemos tres partes importantes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parte 1: Configuraciones previas de AWS. &lt;/li&gt;
&lt;li&gt;Parte 2: Información sobre los recursos requeridos de AWS para el despliegue.&lt;/li&gt;
&lt;li&gt;Parte 3. Despliegue de aplicaciones web con ASP.NET Core y DotVVM desde Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recursos necesarios:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para seguir paso a paso este articulo, es necesario tener en funcionamiento las siguientes herramientas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET Core SDK.&lt;/li&gt;
&lt;li&gt;Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;La carga de trabajo Desarrollo web y ASP.NET para Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;La extensión de DotVVM para Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 1: Configuraciones previas de AWS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Amazon Web Services, también conocida como AWS, es un conjunto de herramientas y servicios de cloud computing de Amazon. Para nuestro objetivo de despliegue, es necesario realizar algunas configuraciones previas, que van desde el ajuste de usuarios, hasta la configuración de AWS en Visual Studio 2019. En otras palabras, estas son las configuraciones previas que realizaremos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Obtener una cuenta de capa gratuita de AWS.&lt;/li&gt;
&lt;li&gt;2. Configurar una cuenta IAM.&lt;/li&gt;
&lt;li&gt;3. Establecer las políticas para un usuario determinado en IAM.&lt;/li&gt;
&lt;li&gt;4. Instalar y configurar AWS Toolkit para Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin más que decir, vamos a profundizar cada una de estas actividades previas y revisar lo que debemos hacer. &lt;/p&gt;

&lt;h4&gt;
  
  
  1. Obtener una cuenta de capa gratuita de AWS
&lt;/h4&gt;

&lt;p&gt;AWS dispone de un nivel gratuito para probar y consumir servicios durante 12 meses. En la siguiente dirección podemos realizar el registro correspondiente: &lt;a href="//aws.amazon.com/free"&gt;aws.amazon.com/free&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Este es un proceso sencillo, sin embargo, hay que tener en cuenta que hay que proporcionar los datos de nuestra tarjeta de crédito/debito para poder activarla.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Configurar una cuenta IAM
&lt;/h4&gt;

&lt;p&gt;Muy bien, suponiendo que ya hemos creado una cuenta raíz en AWS, al iniciar sesión veremos la consola:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffcsfil6kcpydckie1lsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffcsfil6kcpydckie1lsa.png" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro de la consola buscaremos el servicio IAM. Identity and Access Management (IAM), es un servicio que permite administrar el acceso a los servicios y a los recursos de AWS. Asimismo, permite crear y administrar usuarios y grupos de AWS, así como utilizar permisos para conceder o negar el acceso a los recursos. &lt;/p&gt;

&lt;p&gt;Al ingresar a este servicio, nos dirigiremos al apartado &lt;em&gt;Users&lt;/em&gt; dentro del menú de opciones y seleccionaremos &lt;em&gt;Add User&lt;/em&gt;. El objetivo es crear un usuario, el cual se utilizará para asociar los servicios de AWS que se van a utilizar, ya que no es recomendable proporcionar nuestros privilegios de acceso de usuario raíz. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqty8r0unu81oy26vce8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqty8r0unu81oy26vce8c.png" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El formulario para agregar un nuevo usuario se verá de esta manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jrg3ti9qlmh11t6wslc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jrg3ti9qlmh11t6wslc.png" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez que se haya terminado con la creación del nuevo usuario de IAM, es necesario descargar las credenciales. Estas las necesitaremos más adelante para realizar la configuración en Visual Studio. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febzef5kzlgq3825rcywb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febzef5kzlgq3825rcywb.png" width="481" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Nota:&lt;/em&gt;&lt;/strong&gt; es muy importante mantener este archivo CSV en un lugar seguro, ya que allí se encuentran las credenciales de acceso. &lt;/p&gt;

&lt;h4&gt;
  
  
  3. Establecer las políticas del usuario
&lt;/h4&gt;

&lt;p&gt;Para poder desplegar nuestras aplicaciones con ASP.NET Core y DotVVM desde Visual Studio, nuestro nuevo usuario IAM necesita poder acceder a ciertos servicios de AWS. En este caso, nos dirigiremos al usuario en cuestión dentro de IAM en AWS y seleccionamos la opción &lt;em&gt;Add inline policy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgh3deqo8frn7e4l8iy9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgh3deqo8frn7e4l8iy9e.png" width="757" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego, es necesario realizar este proceso para cada uno de los siguientes servicios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk&lt;/li&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;CloudFormation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8cjcat1n427jsozsenxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8cjcat1n427jsozsenxr.png" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después de agregar estos servicios, asignaremos un nombre para esta política y la guardaremos. Al final tendremos algo como esto: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1qc3okmq6rrzd08mzb9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1qc3okmq6rrzd08mzb9b.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Instalar y configurar AWS Toolkit para Visual Studio
&lt;/h4&gt;

&lt;p&gt;Dentro de las configuraciones previas de AWS necesarias, lo que nos resta por hacer es instalar la extensión de AWS para Visual Studio 2019. Esta herramienta nos permitirá trabajar con el ecosistema de .NET en cuanto a desarrollo, depuración e implementación de soluciones en relación con Amazon Web Services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Enlace de descarga:&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2017" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2017&lt;br&gt;
&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para la instalación, Visual Studio 2019 deberá estar cerrado.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4fhyjl2d38gb6c37sl9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4fhyjl2d38gb6c37sl9n.png" width="434" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al iniciar Visual Studio, el asistente de configuración de AWS iniciará y nos pedirá configurar nuestras credenciales. En este caso podemos hacer uso del archivo CSV generado en la creación del usuario correspondiente en IAM. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg73zp7s0eu5mv2x6zacc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg73zp7s0eu5mv2x6zacc.png" width="695" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al guardar las credenciales, tendremos listo &lt;em&gt;AWS Explorer&lt;/em&gt;, el cual nos permitirá trabajar con los servicios de AWS con los que tengamos autorización. Esto de acuerdo con las políticas establecidas anteriormente. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flpd2rpeywxfjgx50j860.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flpd2rpeywxfjgx50j860.png" width="325" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con todo en su lugar, ahora ya podemos trabajar con AWS desde Visual Studio 2019. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 2: Acerca de los servicios requeridos para la implementación en Amazon Web Services&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Como pudimos observar en el proceso de configuración, son varios servicios de AWS que se utilizaran para desplegar nuestras aplicaciones web con ASP.NET Core y DotVVM. A continuación, veremos brevemente de que se trata cada uno de ellos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elastic Beanstalk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Elastic Beanstalk es un servicio de implementación y aprovisionamiento en la nube que automatiza el proceso de configuración de aplicaciones en la infraestructura de Amazon Web Services. &lt;/p&gt;

&lt;p&gt;Para usar el servicio, los desarrolladores solo tenemos que cargar nuestras aplicaciones. El aprovisionamiento, el equilibrio de carga, el escalado automático y la supervisión del estado de las aplicaciones se controlan automáticamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EC2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amazon Elastic Compute Cloud, más conocido como EC2, el servicio estrella de AWS, es una solución de Amazon para ofrecer un entorno informático de capacidad y tamaño modificable. &lt;br&gt;
EC2 cuenta con varias instancias de uso general que brindan una combinación de recursos informáticos, memoria y de red. En esta dirección podemos conocer los tipos de instancias con los que cuenta AWS y sus características: &lt;a href="https://aws.amazon.com/es/ec2/instance-types/" rel="noopener noreferrer"&gt;https://aws.amazon.com/es/ec2/instance-types/&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amazon S3, nombre que proviene de Amazon Simple Storage Service, hace referencia a un servicio ofrecido que proporciona almacenamiento de objetos a través de una interfaz de servicio web. Amazon S3 utiliza la misma infraestructura de almacenamiento escalable que Amazon.com utiliza para ejecutar su red global de comercio electrónico. &lt;/p&gt;

&lt;p&gt;Estos objetos pueden ser distintos tipos de archivos de los que normalmente se encuentran en cualquier ordenador: documentos, archivos comprimidos zip o rar, archivos multimedia, etc. Todo esto se logra mediante un proceso de almacenamiento en buckets, o “cubos” en español, en los que cada usuario puede ir colocando los distintos datos y objetos que desee almacenar. Estos cubos se reparten por la estructura de centros de datos de Amazon de forma que cada usuario sólo puede acceder a sus cubos personales.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CloudFormation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS CloudFormation es un servicio que proporciona un lenguaje común para modelar y aprovisionar recursos para una aplicación a través del entorno de AWS. En otras palabras, AWS CloudFormation permite administrar nuestra infraestructura o un grupo de recursos de AWS en un archivo de texto o plantilla. Una colección de recursos de AWS se denomina pila. Los recursos de AWS se pueden crear o actualizar mediante una pila. Un ejemplo de pila, son los recursos que utilizaremos para el despliegue de nuestra aplicación con ASP.NET Core y DotVVM: Elastic Beanstalk, EC2 y EC3. &lt;/p&gt;




&lt;p&gt;Ahora que ya hemos conocido a breves rasgos los recursos que se utilizaran automáticamente sobre AWS para el despliegue correspondiente, ahora pasaremos a la parte practica desde Visual Studio 2019. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Parte 3: Implementación de proyectos con ASP.NET Core y DotVVM desde Visual Studio 2019&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;El proyecto para este caso con ASP.NET Core y DotVVM está fundamentado en el patrón MVVM (Modelo, Vista, Vistamodelo), con cada una de estas partes dentro del mismo: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El modelo.&lt;/strong&gt; — responsable de todos los datos de la aplicación y de la lógica de negocios relacionada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;La vista.&lt;/strong&gt; — representaciones para el usuario final del modelo de la aplicación. La vista es responsable de mostrar los datos al usuario y de permitir la manipulación de los datos de la aplicación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El Modelo-Vista o Vista-Modelo.&lt;/strong&gt; — uno o más por vista; el modelo-vista es responsable de implementar el comportamiento de la vista para responder a las acciones del usuario y de exponer los datos del modelo fácilmente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teniendo en cuenta estas consideraciones, dentro del proyecto en Visual Studio daremos clic derecho sobre el proyecto, y en la sección de opciones seleccionaremos &lt;em&gt;Publish to AWS Elastic Beanstalk&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuiomshvdy4omfel82daa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuiomshvdy4omfel82daa.png" width="527" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con esto tendremos disponible el asistente de publicación de AWS Elastic Beanstalk, aquí crearemos un nuevo entorno de aplicación: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9srlbeuwji1sd4x0t67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9srlbeuwji1sd4x0t67.png" width="701" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A continuación, elegiremos un nombre para la aplicación y su URL: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzzsa2258cc2fy2gl5bbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzzsa2258cc2fy2gl5bbb.png" width="747" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta misma sección podemos especificar el ambiente con el que deseamos trabajar: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70q88bulq4uqp1apm39f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70q88bulq4uqp1apm39f.png" width="328" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después de comprobar la disponibilidad del URL, configuraremos los requisitos de hardware, en otras palabras, el tipo de instancia EC2:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15dzvuz0syrvch4928nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15dzvuz0syrvch4928nn.png" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este caso en particular con DotVVM, trabajaremos con una imagen de Linux:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5zvcbrzfxifcqqvociya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5zvcbrzfxifcqqvociya.png" width="691" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al finalizar veremos el resumen de las configuraciones realizadas. Para continuar debemos dar clic en &lt;em&gt;Deploy&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F83rbyy35mybax9kjwa7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F83rbyy35mybax9kjwa7z.png" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A partir de este momento el proceso de despliegue a comenzado. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpj9vhwtap5knl63uy2la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpj9vhwtap5knl63uy2la.png" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta implementación puede tardar algunos minutos, dependiendo del tamaño de la aplicación y de los recursos empleados en ASP.NET Core con DotVVM. Estas son las configuraciones que se llevan a cabo internamente: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una máquina virtual de Amazon EC2 es configurada para ejecutar aplicaciones web sobre ASP.NET Core en la versión especificada. &lt;/li&gt;
&lt;li&gt;Un grupo de seguridad de Amazon EC2 es configurado para permitir la entrada en el puerto 80. &lt;/li&gt;
&lt;li&gt;Un balanceador de carga de Elastic Load Balancing para distribuir las solicitudes a las instancias que ejecutan la aplicación.&lt;/li&gt;
&lt;li&gt;Un grupo de Auto Scaling para reemplazar una instancia si se termina o deja de estar disponible.&lt;/li&gt;
&lt;li&gt;Una ubicación de almacenamiento para el código fuente, los logs y otros artefactos.&lt;/li&gt;
&lt;li&gt;Dos alarmas de CloudWatch que monitorizan la carga de las instancias de su entorno y se activan si la carga es demasiado alta o baja.&lt;/li&gt;
&lt;li&gt;Una pila de AWS CloudFormation para lanzar los recursos en su entorno y propagar los cambios de configuración.&lt;/li&gt;
&lt;li&gt;Un nombre de dominio que enruta a la aplicación web en el subdominio región.elasticbeanstalk.com.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Al finalizar este proceso, casi transparente para nosotros, veremos nuestra aplicación desplegada sobre AWS: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffp31bhye927t1tkmu302.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffp31bhye927t1tkmu302.png" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;¿Qué sigue?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Con este articulo hemos aprendido paso a paso sobre la implementación de aplicaciones web con DotVVM sobre ASP.NET Core en Amazon Web Services. &lt;/p&gt;

&lt;p&gt;Una de las grandes ventajas de la nube son las herramientas que estas nos ofrecen para trabajar con nuestras aplicaciones, en este caso, sobre AWS, se han podido apreciar los conceptos relacionados a una Plataforma como Servicio, en el cual, no tenemos que preocuparnos por los procesos internos ni por el control de la infraestructura, solo por el desarrollo como tal. &lt;/p&gt;

&lt;p&gt;A continuación se muestran algunos recursos que podrían ser de tu interés para seguir adquiriendo nuevos conocimientos en esta área:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Curso gratuito y abierto en YouTube: &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;Fundamentos de ASP.NET Core y DotVVM&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe"&gt;DotVVM y ASP.NET Core: Implementación de operaciones CRUD&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/esdanielgomez/implementacion-continua-en-azure-con-visual-studio-y-github-2153"&gt;Implementación continua en Azure con Visual Studio y GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gracias:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si tienes alguna inquietud o necesitas ayuda en algo particular, será un gusto poder colaborar.&lt;/p&gt;

&lt;p&gt;Nos vemos en &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

&lt;p&gt;¡Hasta pronto!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>dotnet</category>
      <category>dotvvm</category>
    </item>
    <item>
      <title>Deploy web applications with ASP.NET Core and DotVVM on AWS Elastic Beanstalk</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Thu, 23 Jul 2020 18:12:57 +0000</pubDate>
      <link>https://forem.com/dotvvm/deploy-web-applications-with-asp-net-core-and-dotvvm-on-aws-elastic-beanstalk-2m92</link>
      <guid>https://forem.com/dotvvm/deploy-web-applications-with-asp-net-core-and-dotvvm-on-aws-elastic-beanstalk-2m92</guid>
      <description>&lt;p&gt;Today, cloud computing is a trend in the tech world, due to its impact in generating services and computing for users and businesses. If we focus on the area of software development through ASP.NET for example, one of the direct partnerships with the cloud is being able to deploy these applications. &lt;/p&gt;

&lt;p&gt;In this article, we will learn how to deploy web sites in the cloud, specifically with DotVVM on ASP.NET Core 3.1 to Amazon Web Services, under a &lt;em&gt;Platform as a Service – PaaS&lt;/em&gt; approach. If we remember this approach within the types of cloud services, we refer to a development and deployment environment, without worrying about managing technology infrastructure resources. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activities:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To perform language activities on AWS, we have three important parts: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 1: Pre-AWS Configurations. &lt;/li&gt;
&lt;li&gt;Part 2: Information about the resources required by AWS for the program.&lt;/li&gt;
&lt;li&gt;Part 3. Web application time with ASP.NET Core and DotVVM from Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources Required:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To follow this article step by step, you need to have the following tools in the following accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET Core SDK.&lt;/li&gt;
&lt;li&gt;Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;The Web Development and ASP.NET workload for Visual Studio 2019.&lt;/li&gt;
&lt;li&gt;The DotVVM extension for Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 1: AWS Pre-Configurations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Amazon Web Services, also known as AWS, is a set of Amazon cloud computing tools and services. For our deployment goal, we need to make some pre-configurations, ranging from user tuning to configuring AWS in Visual Studio 2019. In other words, these are the previous configurations we will make: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Get an AWS Free Tier account.&lt;/li&gt;
&lt;li&gt;2. Set up an IAM account.&lt;/li&gt;
&lt;li&gt;3. Set policies for a given user in IAM.&lt;/li&gt;
&lt;li&gt;4. Install and configure the AWS Toolkit for Visual Studio 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without more to say, let's deepen each of these previous activities and review what we need to do. &lt;/p&gt;

&lt;h4&gt;
  
  
  1. Get an AWS Free Tier Account
&lt;/h4&gt;

&lt;p&gt;AWS has a free tier to test and consume services for 12 months. At the following address, we can register accordingly: &lt;a href="//aws.amazon.com/free"&gt;aws.amazon.com/free&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a simple process, however, it should be noted that we have to provide the credit/debit card details in order to activate it.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Set up an IAM account
&lt;/h4&gt;

&lt;p&gt;All right, assuming we've already created a root account on AWS, when we sign in, we'll see the console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffcsfil6kcpydckie1lsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffcsfil6kcpydckie1lsa.png" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within the console, we'll search for the IAM service. Identity and Access Management (IAM) is a service that allows us to manage access to AWS services and resources. It also allows us to create and manage AWS users and groups, and use permissions to grant or deny access to resources. &lt;/p&gt;

&lt;p&gt;When we enter this service, we will go to the &lt;em&gt;Users&lt;/em&gt; section in the options menu and select &lt;em&gt;Add User&lt;/em&gt;. The goal is to create a user, which will be used to associate the AWS services to be used, as it is not recommended to provide our root user access privileges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqty8r0unu81oy26vce8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqty8r0unu81oy26vce8c.png" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form to add a new user will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jrg3ti9qlmh11t6wslc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jrg3ti9qlmh11t6wslc.png" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we're done with creating the new IAM user, we need to download the credentials. We'll need these later to configure in Visual Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febzef5kzlgq3825rcywb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febzef5kzlgq3825rcywb.png" width="481" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; It is very important to keep this CSV file in a safe place, as the login credentials are located there.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Set user policies
&lt;/h4&gt;

&lt;p&gt;In order to deploy our applications with ASP.NET Core and DotVVM from Visual Studio, our new IAM user needs to be able to access certain AWS services. In this case, we'll target the user in question within IAM on AWS and select the &lt;em&gt;Add inline policy&lt;/em&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgh3deqo8frn7e4l8iy9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgh3deqo8frn7e4l8iy9e.png" width="757" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, we need to perform this process for each of the following services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk&lt;/li&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;CloudFormation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8cjcat1n427jsozsenxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8cjcat1n427jsozsenxr.png" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding these services, we will name this policy and save it. In the end, we'll have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1qc3okmq6rrzd08mzb9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1qc3okmq6rrzd08mzb9b.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Install and configure the AWS Toolkit for Visual Studio
&lt;/h4&gt;

&lt;p&gt;Within the required pre-configurations of AWS, the last thing to do is to install the AWS extension for Visual Studio 2019. This tool will allow us to work with the .NET ecosystem in terms of developing, debugging, and deploying solutions in relation to Amazon Web Services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Download link:&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2017" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2017&lt;br&gt;
&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For installation, Visual Studio 2019 must be closed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4fhyjl2d38gb6c37sl9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4fhyjl2d38gb6c37sl9n.png" width="434" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we start Visual Studio, the AWS Setup Wizard will start and ask us to configure our credentials. In this case, we can make use of the CSV file generated in the creation of the corresponding user in IAM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg73zp7s0eu5mv2x6zacc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg73zp7s0eu5mv2x6zacc.png" width="695" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we save our credentials, we'll be ready with &lt;em&gt;AWS Explorer&lt;/em&gt;, which lets us work with the AWS services we're authorized to. This in accordance with the policies set out above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flpd2rpeywxfjgx50j860.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flpd2rpeywxfjgx50j860.png" width="325" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All in place, we can now work with AWS from Visual Studio 2019.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 2: Information about the services required for deployment to Amazon Web Services&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As we saw in the setup process, there are several AWS services that were used to deploy our web applications with ASP.NET Core and DotVVM. Next, we will briefly see what each of them is about. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elastic Beanstalk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Elastic Beanstalk is a cloud deployment and provisioning service that automates the application configuration process in our Amazon Web Services infrastructure. &lt;/p&gt;

&lt;p&gt;To use the service, developers only have to load our apps. Provisioning, load balancing, auto-scaling, and monitoring the health of applications are handled automatically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EC2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amazon Elastic Compute Cloud, better known as EC2, AWS's flagship service, is an Amazon solution for providing a capacity and size computing environment that can be modified. &lt;br&gt;
EC2 has several general-purpose instances that provide a combination of computing, memory, and network resources. At this address, we can learn about the types of instances AWS has and its features: &lt;a href="https://aws.amazon.com/ec2/instance-types/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/instance-types/&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amazon S3, a name that comes from Amazon Simple Storage Service, refers to an offered service that provides object storage through a web service interface. Amazon S3 uses the same scalable storage infrastructure that Amazon.com used to run its global e-commerce network. &lt;/p&gt;

&lt;p&gt;These objects can be different types of files than are normally found on any computer: documents, compressed zip or rar files, multimedia files, etc. All this is achieved through a bucket storage process, or "cubes" in Spanish, in which each user can place the different data and objects that they want to store. These cubes are spread across Amazon's datacenter structure so that each user can only access their personal cubes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CloudFormation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS CloudFormation is a service that provides a common language for modeling and provisioning resources for an application through the AWS environment. In other words, AWS CloudFormation allows us to manage our infrastructure or a group of AWS resources in a text file or template. A collection of AWS resources is called a stack. AWS resources can be created or updated using a stack. An example stack is the resources we'll use for deploying our application with ASP.NET Core and DotVVM: Elastic Beanstalk, EC2, and EC3. &lt;/p&gt;




&lt;p&gt;Now that we've briefly known the resources that were automatically used on AWS for the corresponding deployment, we'll now move on to the practice part from Visual Studio 2019.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 3: Implementing projects with ASP.NET Core and DotVVM from Visual Studio 2019&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The project for this case with ASP.NET Core and DotVVM is based on the MVVM pattern (Model, View, Viewmodel), with each of these parts within it: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model.&lt;/strong&gt; — responsible for all application data and related business logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The view.&lt;/strong&gt; — representations for the end-user of the application model. The view is responsible for displaying the data to the user and allowing manipulation of application data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model-View or View-Model.&lt;/strong&gt; — one or more per view; the model-view is responsible for implementing view behavior to respond to user actions and for easily exposing model data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taking these considerations into account, within the project in Visual Studio we will right-click on the project, and in the options section we will select &lt;em&gt;Publish to AWS Elastic Beanstalk&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuiomshvdy4omfel82daa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuiomshvdy4omfel82daa.png" width="527" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this we'll have the AWS Elastic Beanstalk publishing wizard available, here we'll create a new application environment:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9srlbeuwji1sd4x0t67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb9srlbeuwji1sd4x0t67.png" width="701" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we'll choose a name for the app and its URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzzsa2258cc2fy2gl5bbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzzsa2258cc2fy2gl5bbb.png" width="747" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this same section we can specify the environment with which we want to work:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70q88bulq4uqp1apm39f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F70q88bulq4uqp1apm39f.png" width="328" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After checking the availability of the URL, we'll configure the hardware requirements, in other words, the EC2 instance type:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15dzvuz0syrvch4928nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F15dzvuz0syrvch4928nn.png" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this particular case with DotVVM, we will work with a Linux image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5zvcbrzfxifcqqvociya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5zvcbrzfxifcqqvociya.png" width="691" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the end we will see the summary of the configurations made. To continue we must click on &lt;em&gt;Deploy&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F83rbyy35mybax9kjwa7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F83rbyy35mybax9kjwa7z.png" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point on, the deployment process has begun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpj9vhwtap5knl63uy2la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpj9vhwtap5knl63uy2la.png" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This deployment may take a few minutes, depending on the size of the application and the resources used in ASP.NET Core with DotVVM. These are the configurations that are performed internally: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An Amazon EC2 VM is configured to run web applications on ASP.NET Core in the specified version. &lt;/li&gt;
&lt;li&gt;An Amazon EC2 security group is configured to allow entry on port 80. &lt;/li&gt;
&lt;li&gt;An Elastic Load Balancing to distribute requests to the instances running the application.&lt;/li&gt;
&lt;li&gt;An Auto Scaling group to replace an instance if it is terminated or becomes unavailable.&lt;/li&gt;
&lt;li&gt;A storage location for source code, logs, and other artifacts.&lt;/li&gt;
&lt;li&gt;Two CloudWatch alarms that monitor the load on instances in our environment and fire if the load is too high or too low.&lt;/li&gt;
&lt;li&gt;An AWS CloudFormation stack to launch resources in our environment and propagate configuration changes.&lt;/li&gt;
&lt;li&gt;A domain name that routes to the web application in the región.elasticbeanstalk.com subdomain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of this process, almost transparent to us, we'll see our AWS-deployed application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffp31bhye927t1tkmu302.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffp31bhye927t1tkmu302.png" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What's next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With this article, we learned step-by-step about deploying web applications with DotVVM on ASP.NET Core on Amazon Web Services. &lt;/p&gt;

&lt;p&gt;One of the great advantages of the cloud are the tools that these offer us to work with our applications, in this case, over AWS, we have been able to appreciate the concepts related to a Platform as a Service, in which we do not have to worry about internal processes or control of infrastructure, just about development as such. &lt;/p&gt;

&lt;p&gt;Here are some resources that might be of interest to you to continue to gain new knowledge in this area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/dotvvm-and-asp-net-core-implementing-crud-operations-l2e"&gt;DotVVM and ASP.NET Core: Implementing CRUD operations&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/developing-web-applications-with-net-core-dotvvm-and-mongodb-286l"&gt;Developing web applications with ASP.NET Core, DotVVM and MongoDB&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/working-with-web-services-through-asp-net-core-and-dotvvm-a-step-by-step-guide-2le"&gt;Working with web services through ASP.NET Core and DotVVM (A step by step guide)&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thank you:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have any concerns or need help in something particular, it will be a pleasure to be able to collaborate with you.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>dotnet</category>
      <category>dotvvm</category>
    </item>
    <item>
      <title>DotVVM Controls : GridView</title>
      <dc:creator>Amir Ismail</dc:creator>
      <pubDate>Wed, 22 Jul 2020 22:06:46 +0000</pubDate>
      <link>https://forem.com/dotvvm/dotvvm-controls-gridview-1gjh</link>
      <guid>https://forem.com/dotvvm/dotvvm-controls-gridview-1gjh</guid>
      <description>&lt;p&gt;GridView control in DotVVM is very similar to what we used to use in our legacy web forms applications. When you run your DotVVM application, it is getting rendered as a classic HTML table.&lt;/p&gt;

&lt;p&gt;In DotVVM, you can bind your &lt;code&gt;GridView&lt;/code&gt; control by setting &lt;code&gt;DataSource&lt;/code&gt; property to &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; or &lt;code&gt;GridViewDataSet&amp;lt;T&amp;gt;&lt;/code&gt; object. GridView Control in DotVVM supports inline editing, sorting and defining your column template.&lt;/p&gt;

&lt;h4&gt;
  
  
  Simple GridView
&lt;/h4&gt;

&lt;p&gt;Suppose we want to display a list of students.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime EnrollmentDate { get; set; }
}    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in ViewModel class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public List&amp;lt;Student&amp;gt; Students { get; set; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in dothtml file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dot:GridView DataSource="{value: Students}" class="page-grid"&amp;gt;
    &amp;lt;Columns&amp;gt;
         &amp;lt;dot:GridViewTextColumn ValueBinding="{value: FirstName}" HeaderText="First Name" /&amp;gt;
         &amp;lt;dot:GridViewTextColumn ValueBinding="{value: LastName}" HeaderText="Last Name" /&amp;gt;
         &amp;lt;dot:GridViewTextColumn ValueBinding="{value: EnrollmentDate}" HeaderText="Enrollment Date" /&amp;gt;
    &amp;lt;/Columns&amp;gt;
&amp;lt;/dot:GridView&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we used &lt;code&gt;GridViewTextColumn&lt;/code&gt; for all fields and used &lt;code&gt;ValueBinding&lt;/code&gt; attribute to specify which property is going to be rendered in that column. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fflf7djiuf7f8uaew6bnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fflf7djiuf7f8uaew6bnh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By Default DotVVM is getting the string representation of the specified value and render it.&lt;/p&gt;
&lt;h4&gt;
  
  
  FormatString
&lt;/h4&gt;

&lt;p&gt;To specify a specific format for the rendered value, we can do that by setting &lt;code&gt;FormatString&lt;/code&gt; of the target column. DotVVM is supporting most of .Net format strings&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dot:GridViewTextColumn ValueBinding="{value: EnrollmentDate}" 
 FormatString="yyyy-MM-dd" 
 HeaderText="Enrollment Date" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd60ug9pauawij4gkecbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd60ug9pauawij4gkecbt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Inline Editing
&lt;/h4&gt;

&lt;p&gt;In the past when we tried to implement inline editing for a GridView in web forms application we had had to write many lines of code and implement Edit event but in DotVVM it pretty easy to implement it with only one limitation, your data source should be of type &lt;code&gt;GridViewDataSet&amp;lt;T&amp;gt;&lt;/code&gt;. &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; is not supported for inline editing.&lt;/p&gt;

&lt;p&gt;In ViewModel class change the Students property type and Set &lt;code&gt;RowEditOptions.PrimaryKeyPropertyName&lt;/code&gt; to your list unique key(in our case is &lt;code&gt;Id&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public GridViewDataSet&amp;lt;Student&amp;gt; Students { get; set; } = new GridViewDataSet&amp;lt;StudentListModel&amp;gt;()
   {
      RowEditOptions = { PrimaryKeyPropertyName = "Id" }
   };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;PreRender&lt;/code&gt; method populate your &lt;code&gt;GridViewDataSet&amp;lt;Student&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public override async Task PreRender()
{
     if (Students.IsRefreshRequired)
     {
         var queryable = await _studentService.GetAllStudentsAsync();
         Students.LoadFromQueryable(queryable.AsQueryable());
     }
     await base.PreRender();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in dothtml file, set &lt;code&gt;InlineEditing&lt;/code&gt; attribute of your GridView to &lt;code&gt;true&lt;/code&gt;. By default DotVVM is allowing all columns to be editable. If you want to prevent a specific column to be edited you need to set its &lt;code&gt;IsEditable&lt;/code&gt; attribute to &lt;code&gt;false&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dot:GridView DataSource="{value: Students}" class="page-grid" InlineEditing="true"&amp;gt;
  &amp;lt;Columns&amp;gt;
    &amp;lt;dot:GridViewTextColumn ValueBinding="{value: FirstName}" HeaderText="First Name" /&amp;gt;
    &amp;lt;dot:GridViewTextColumn ValueBinding="{value: LastName}" HeaderText="Last Name" /&amp;gt;
    &amp;lt;dot:GridViewTextColumn ValueBinding="{value: EnrollmentDate}"
       IsEditable="false"
       HeaderText="Enrollment Date" FormatString="yyyy-MM-dd" /&amp;gt;
    &amp;lt;dot:GridViewTemplateColumn&amp;gt;
        &amp;lt;ContentTemplate&amp;gt;
           &amp;lt;dot:Button class Text="Edit" Click="{command: _parent.Edit(_this)}" /&amp;gt;
        &amp;lt;/ContentTemplate&amp;gt;
        &amp;lt;EditTemplate&amp;gt;
           &amp;lt;dot:Button Text="Save" Click="{command: _parent.Update(_this)}" /&amp;gt;
           &amp;lt;dot:Button Text="Cancel" Click="{command: _parent.Cancel()}" /&amp;gt;
        &amp;lt;/EditTemplate&amp;gt;
    &amp;lt;/dot:GridViewTemplateColumn&amp;gt;
  &amp;lt;/Columns&amp;gt;  
&amp;lt;/dot:GridView&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We added a&lt;code&gt;GridViewTemplateColumn&lt;/code&gt; and specified its &lt;code&gt;ContentTemplate&lt;/code&gt; which will be rendered in normal display &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffjko72wdov3c5l97eacy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffjko72wdov3c5l97eacy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
and &lt;code&gt;EditTemplate&lt;/code&gt; which will be rendered when we click Edit button &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5drqna12eyz2a351y7me.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5drqna12eyz2a351y7me.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;_parent&lt;/code&gt; is instance of your model object and &lt;code&gt;_this&lt;/code&gt; which is passed to &lt;code&gt;Edit&lt;/code&gt; and &lt;code&gt;Update&lt;/code&gt; Methods is the corresponding item in GridView data source.&lt;/p&gt;

&lt;p&gt;in ModelView class we need to add the commands (normal c# method) that will be executed when the user click on Edit, Save, and cancel buttons.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void Edit(Student student)
{
     Students.RowEditOptions.EditRowId = student.Id;
}
public void Cancel()
{
     Students.RowEditOptions.EditRowId = null;
     Students.RequestRefresh();
}
public void Update(StudentListModel model)
{
     // code for updating your datastore
     .....
     Students.RowEditOptions.EditRowId = null;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;When you do inline editing, DotVVM does't refresh the whole page, but it do it via ajax calls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Nested GridViews
&lt;/h4&gt;

&lt;p&gt;Suppose we want to display student grades in the same row besides his Name. to achieve this, the Student Object should contains a property if type &lt;code&gt;GridViewDataSet&lt;/code&gt; for grades List. Then in &lt;code&gt;Prerender()&lt;/code&gt; method populate that property for each Student object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public override async Task PreRender()
{
     if (Students.IsRefreshRequired)
     {
         var queryable = await _studentService.GetAllStudentsAsync();
         queryable.ForEach(x =&amp;gt;
         {
             x.Grades = new GridViewDataSet&amp;lt;Grade&amp;gt;()
             {
                RowEditOptions = { PrimaryKeyPropertyName = "GradeId" }
             };                 
             x.Grades.LoadFromQueryable(x.StudentGrades.AsQueryable());
         });
         Students.LoadFromQueryable(queryable.AsQueryable());
     }
     await base.PreRender();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in dothtml file will add a new GridViewTemplateColumn for the inner GridView&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dot:GridViewTemplateColumn HeaderText="Grades" IsEditable="false"&amp;gt;
     &amp;lt;dot:GridView DataSource="{value: Grades}" class="page-grid"&amp;gt;
          &amp;lt;Columns&amp;gt;
              &amp;lt;dot:GridViewTextColumn ValueBinding="{value: Subject}" HeaderText="Subject" /&amp;gt;
              &amp;lt;dot:GridViewTextColumn ValueBinding="{value: Month}" HeaderText="Month" /&amp;gt;
              &amp;lt;dot:GridViewTextColumn ValueBinding="{value: Score}" HeaderText="Score" /&amp;gt;                            
          &amp;lt;/Columns&amp;gt;
     &amp;lt;/dot:GridView&amp;gt;
&amp;lt;/dot:GridViewTemplateColumn&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5vz98dkv4nj4y5zwcdn6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5vz98dkv4nj4y5zwcdn6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;In this article we demonstrated how to use DotVVM GridView control and how it is pretty easy to bind your collection to it, enable inline editing without re-loading the whole page and how to render nested GridViews with few line of code.  &lt;/p&gt;

</description>
      <category>dotvvm</category>
      <category>webforms</category>
      <category>csharp</category>
      <category>dotnetcore</category>
    </item>
    <item>
      <title>Diseño de formularios web con Bootstrap para DotVVM desde ASP.NET Core</title>
      <dc:creator>Daniel Gomez</dc:creator>
      <pubDate>Mon, 20 Jul 2020 12:44:28 +0000</pubDate>
      <link>https://forem.com/dotvvm/diseno-de-formularios-web-con-bootstrap-para-dotvvm-desde-asp-net-core-5ddc</link>
      <guid>https://forem.com/dotvvm/diseno-de-formularios-web-con-bootstrap-para-dotvvm-desde-asp-net-core-5ddc</guid>
      <description>&lt;p&gt;Bootstrap, es un framework originalmente creado por Twitter, que permite crear interfaces web con CSS y JavaScript, cuya particularidad es la de adaptar la interfaz del sitio web al tamaño del dispositivo en que se visualice. Es decir, el sitio web se adapta automáticamente al tamaño de una PC, una Tablet u otro dispositivo. Esta técnica de diseño y desarrollo se conoce como “responsive design” o diseño adaptativo.&lt;/p&gt;

&lt;p&gt;Bootstrap tiene varios recursos para configurar los estilos de los elementos de la página de una manera simple y eficiente, además de facilitar la construcción de páginas que, al mismo tiempo, están adaptadas para la web y para dispositivos móviles. Dentro del marco de trabajo de ASP.NET Core, específicamente DotVVM para el diseño de páginas web, existe un conjunto de herramientas denominadas como Bootstrap for DotVVM, la cual nos permite trabajar con ASP.NET Core y Bootstrap a la vez. &lt;/p&gt;

&lt;h4&gt;
  
  
  El patrón de diseño Modelo, Vista, Vistamodelo - MVVM
&lt;/h4&gt;

&lt;p&gt;DotVVM se fundamenta en el patrón de diseño Modelo, Vista, Vistamodelo sobre .NET para la comunicación entre HTML (páginas web) y C# (código fuente). La finalidad de estas partes son las siguientes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El modelo&lt;/strong&gt;. — es responsable de todos los datos de la aplicación y de la lógica de negocios relacionada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;La vista&lt;/strong&gt;. — Representaciones para el usuario final del modelo de la aplicación. La vista es responsable de mostrar los datos al usuario y de permitir la manipulación de los datos de la aplicación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El Modelo-Vista o Vista-Modelo&lt;/strong&gt;. — uno o más por vista; el modelo-vista es responsable de implementar el comportamiento de la vista para responder a las acciones del usuario y de exponer los datos del modelo fácilmente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Adquirir Bootstrap for DotVVM
&lt;/h4&gt;

&lt;p&gt;Bootstrap for DotVVM no es más que un NuGet privado para Visual Studio, en el cual, podemos hacer uso de los competentes ya establecidos para la construcción de aplicaciones web en el ámbito empresarial. &lt;/p&gt;

&lt;p&gt;Para la instalación de la versión del Bootstrap for DotVVM, además de obtener la licencia correspondiente (existe una versión de prueba), es necesario realizar una configuración de unos pocos minutos para poder emplear estas funcionalidades. Los pasos para agregar el NuGet privado se pueden consultar en la siguiente dirección: &lt;a href="https://www.dotvvm.com/docs/tutorials/commercial-bootstrap-for-dotvvm/2.0" rel="noopener noreferrer"&gt;Installing Bootstrap for DotVVM&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Crear un proyecto Bootstrap for DotVVM en Visual Studio 2019
&lt;/h4&gt;

&lt;p&gt;Para crear un proyecto con la opción de Bootstrap en DotVVM desde Visual Studio 2019, empezaremos creando el proyecto para este caso de tipo &lt;em&gt;DotVVM Web Application (.NET Core)&lt;/em&gt;: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcx6h29oyq7t16ifhfi07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcx6h29oyq7t16ifhfi07.png" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al especificar el nombre y continuar, el asistente de inicialización del proyecto nos brindará una serie de opciones para agregar ciertas funcionalidades al proyecto. En este caso la funcionalidad que nos interesa es la de &lt;em&gt;Bootstrap for DotVVM&lt;/em&gt; ubicada en la sección &lt;em&gt;DotVVM Commercial Extensions&lt;/em&gt;: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fojhn920bey9mso9jrc5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fojhn920bey9mso9jrc5n.png" width="576" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Formulario web con Bootstrap for DotVVM
&lt;/h4&gt;

&lt;p&gt;Para ejemplificar la utilización de ciertos componentes de Bootstrap con DotVVVM tendemos una pequeña aplicación web como esta: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkqllnqsx3s4c2dbcon8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkqllnqsx3s4c2dbcon8x.png" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teniendo en cuenta que esta página web en DotVVM está conformada por una vista y por su correspondiente vistamodelo, analicemos las partes más importantes en conjunto de estos elementos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Vista&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dot:Content&lt;/span&gt; &lt;span class="na"&gt;ContentPlaceHolderID=&lt;/span&gt;&lt;span class="s"&gt;"MainContent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;bs:PageHeader&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;b&amp;gt;&lt;/span&gt;{{value: Title}}&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/bs:PageHeader&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bs:Form&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;bs:Panel&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Primary"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:70%;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;HeaderTemplate&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;bs:Image&lt;/span&gt; &lt;span class="na"&gt;ImageUrl=&lt;/span&gt;&lt;span class="s"&gt;"UserIcon.png"&lt;/span&gt; &lt;span class="na"&gt;AlternateText=&lt;/span&gt;&lt;span class="s"&gt;"Persons"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"35%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"35%"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/HeaderTemplate&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;ContentTemplate&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;bs:FormGroup&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;Validator.Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Username}"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.InvalidCssClass=&lt;/span&gt;&lt;span class="s"&gt;"has-error"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.SetToolTipText=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
                             &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                            &lt;span class="nt"&gt;&amp;lt;bs:TextBoxGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"Username"&lt;/span&gt;
                                             &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Username}"&lt;/span&gt;
                                             &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Normal"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;bs:FormGroup&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;Validator.Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.EnrollmentDate}"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.InvalidCssClass=&lt;/span&gt;&lt;span class="s"&gt;"has-error"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.SetToolTipText=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
                             &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;bs:DateTimePickerGroup&lt;/span&gt; &lt;span class="na"&gt;SelectedDate=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.EnrollmentDate}"&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"EnrollmentDate"&lt;/span&gt; &lt;span class="na"&gt;Mode=&lt;/span&gt;&lt;span class="s"&gt;"Date"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;bs:FormGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"Gender"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;Validator.Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.InvalidCssClass=&lt;/span&gt;&lt;span class="s"&gt;"has-error"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.SetToolTipText=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
                             &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                            &lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Male"&lt;/span&gt;
                                            &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Male"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt;
                                            &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Female"&lt;/span&gt;
                                            &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Female"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt;
                                            &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;
                                            &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;
                                            &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt; 
                                            &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;bs:FormGroup&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;Validator.Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.About}"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.InvalidCssClass=&lt;/span&gt;&lt;span class="s"&gt;"has-error"&lt;/span&gt;
                             &lt;span class="na"&gt;Validator.SetToolTipText=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
                             &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;bs:TextBoxGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"About"&lt;/span&gt;
                                             &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.About}"&lt;/span&gt;
                                             &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"MultiLine"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;/ContentTemplate&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;FooterTemplate&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;Bootstrap for DotVVM with ASP.NET Core demo&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/FooterTemplate&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/bs:Panel&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/bs:Form&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/dot:Content&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;**Vistamodelo&lt;/em&gt;*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DefaultViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MasterPageViewModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PersonModel&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PersonModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;EnrollmentDate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DefaultViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Person Form"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Modelo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El modelo para los datos de una persona se encuentra definida de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;EnrollmentDate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Gender&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;About&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer elemento Bootstrap dentro de la aplicación es el componente &lt;code&gt;PageHeader&lt;/code&gt;, el cua, representa el encabezado de esta página web.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bs:PageHeader&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;align=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;b&amp;gt;&lt;/span&gt;{{value: Title}}&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bs:PageHeader&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para el formato base del formulario web, se hace uso del componente &lt;code&gt;Form&lt;/code&gt;. Como su nombre lo indica, este elemento representa a un formulario Bootstrap. Para los elementos correspondientes como las cajas de texto, los RadioButton, LabelText, etc. se utiliza el control FormGroup para indicar que estos elementos son parte de este formulario. Por ejemplo, para un formulario con un &lt;code&gt;TextBox&lt;/code&gt;, el código fuente se vería algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bs:Form&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bs:FormGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"TextBox"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dot:TextBox&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: Text}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bs:Form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para mostrar una interfaz visualmente amigable para el usuario y para ejemplificar los controles de Bootstrap, el formulario está organizado a través del componente &lt;code&gt;Panel&lt;/code&gt;, el cual permite establecer un encabezado, un cuerpo y un pie de página.&lt;/p&gt;

&lt;p&gt;En el encabezado por ejemplo podemos encontrarnos en este caso con una imagen que ha sido creada a través del componente &lt;code&gt;Image&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa3b42wp0gowwtbmfr7tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa3b42wp0gowwtbmfr7tn.png" width="746" height="220"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;HeaderTemplate&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;bs:Image&lt;/span&gt; &lt;span class="na"&gt;ImageUrl=&lt;/span&gt;&lt;span class="s"&gt;"UserIcon.png"&lt;/span&gt; &lt;span class="na"&gt;AlternateText=&lt;/span&gt;&lt;span class="s"&gt;"Persons"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"35%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"35%"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/HeaderTemplate&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro del contenido del panel se encuentran los elementos propios del formulario, cada uno con un componente de los controles base llamado &lt;code&gt;Validator&lt;/code&gt;, el cual, como su nombre lo indica, permite realizar validaciones en un formulario. Por el ejemplo, para el atributo &lt;code&gt;Username&lt;/code&gt; de una Persona, la validación se realiza de acuerdo con las anotaciones establecidas en el modelo de la clase Persona, &lt;code&gt;[Required]&lt;/code&gt; para este atributo en particular.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el caso del atributo &lt;code&gt;Username&lt;/code&gt; para una persona, el componente &lt;code&gt;TextBoxGroup&lt;/code&gt; es utilizado para representarlo visualmente en el formulario. Uno de los atributos de este control es el &lt;code&gt;LabelText&lt;/code&gt;, el cual permite establecer una etiqueta para esta caja de texto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkrnttmowyj8ssv7uofds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkrnttmowyj8ssv7uofds.png" width="713" height="68"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bs:FormGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;Validator.Value=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Username}"&lt;/span&gt;
            &lt;span class="na"&gt;Validator.InvalidCssClass=&lt;/span&gt;&lt;span class="s"&gt;"has-error"&lt;/span&gt;
            &lt;span class="na"&gt;Validator.SetToolTipText=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
            &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"page-input-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;bs:TextBoxGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"Username"&lt;/span&gt;
                            &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Username}"&lt;/span&gt;
                            &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"Normal"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bs:FormGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Siguiendo esta secuencia, para el campo &lt;code&gt;EnrollmentDate&lt;/code&gt; se utiliza el control &lt;code&gt;DateTimePickerGroup&lt;/code&gt;. Algo interesante de este componente es que nos permite trabajar con distintos formatos de fecha, hora o la combinación de ambos. En la siguiente imagen podemos ver un ejemplo de esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkmpqw3vex5l74v39t4dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkmpqw3vex5l74v39t4dr.png" width="247" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el caso del genero de la persona, se utiliza el componente &lt;code&gt;RadioButton&lt;/code&gt;, el cual extiende el control &lt;code&gt;RadioButton&lt;/code&gt; predeterminado con características de Bootstrap adicionales. Para este caso se hace uso del atributo &lt;code&gt;IsInline&lt;/code&gt;, ya que permite establecer si habrá más botones de opción en la misma línea. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpmwfkk3axgv9er61x4aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpmwfkk3axgv9er61x4aa.png" width="553" height="124"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Male"&lt;/span&gt;
                &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Male"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt;
                &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Female"&lt;/span&gt;
                &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Female"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt;
                &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;bs:RadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;
                &lt;span class="na"&gt;GroupName=&lt;/span&gt;&lt;span class="s"&gt;"RadioButtonsGenders"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedValue=&lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;
                &lt;span class="na"&gt;CheckedItem=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.Gender}"&lt;/span&gt; 
                &lt;span class="na"&gt;Inline=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, para el campo &lt;code&gt;About&lt;/code&gt; de la persona también se utiliza con componente de tipo &lt;code&gt;TextBoxGroup&lt;/code&gt; como en el campo de &lt;code&gt;Username&lt;/code&gt;, la diferencia en este caso es en el atributo &lt;code&gt;Type&lt;/code&gt;, siendo en esta ocasión de tipo &lt;code&gt;MultiLine&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bs:TextBoxGroup&lt;/span&gt; &lt;span class="na"&gt;LabelText=&lt;/span&gt;&lt;span class="s"&gt;"About"&lt;/span&gt;
                    &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{value: Person.About}"&lt;/span&gt;
                    &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"MultiLine"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ¿Qué sigue?
&lt;/h4&gt;

&lt;p&gt;Con este artículo, hemos aprendido ciertas características de los componentes personalizados de Bootstrap para DotVVM. Asimismo, hemos visto como crear formularios dinámicos a través de la implementación de vistas y modelos de las vistas con los controles predefinidos por DotVVM sobre ASP.NET Core desde Visual Studio 2019 para trabajar con páginas web. &lt;/p&gt;

&lt;p&gt;El código fuente de esta implementación está disponible en este repositorio: &lt;a href="https://github.com/esdanielgomez/BootstrapForDotVVM" rel="noopener noreferrer"&gt;Bootstrap for ASP.NET Core with DotVVM&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recursos adicionales&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deseas seguir adquiriendo nuevos conocimientos sobre ASP.NET Core y DotVVM, estos recursos podrían ser de tu interés:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Curso gratuito y abierto en YouTube: &lt;a href="http://bit.ly/cursoaspnetdotvvm" rel="noopener noreferrer"&gt;Fundamentos de ASP.NET Core y DotVVM&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/dotvvm/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe"&gt;DotVVM y ASP.NET Core: Implementación de operaciones CRUD&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gracias:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si tienes alguna inquietud o necesitas ayuda en algo particular, será un gusto poder ayudar. &lt;/p&gt;

&lt;p&gt;Nos vemos en &lt;a href="https://twitter.com/esDanielGomez" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!! :)&lt;/p&gt;

&lt;p&gt;¡Hasta pronto!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
