<?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>DEV Community: James Amattey</title>
    <description>The latest articles on DEV Community by James Amattey (@jamattey).</description>
    <link>https://dev.to/jamattey</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%2Fuser%2Fprofile_image%2F813565%2Fb969a513-caeb-42c4-91c1-ef2bfdd7473e.jpeg</url>
      <title>DEV Community: James Amattey</title>
      <link>https://dev.to/jamattey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jamattey"/>
    <language>en</language>
    <item>
      <title>What To Expect In .NET 7</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Tue, 30 Aug 2022 11:48:53 +0000</pubDate>
      <link>https://dev.to/jamattey/what-to-expect-in-net-7-56n6</link>
      <guid>https://dev.to/jamattey/what-to-expect-in-net-7-56n6</guid>
      <description>&lt;h2&gt;
  
  
  Microsoft's .NET Release Cycle
&lt;/h2&gt;

&lt;p&gt;In 2016, Microsoft released .NET 3.0 as a cross-platform framework. Since the official release of .NET 5 in November, Microsoft has committed to an annual release cycle for .NET as it focuses on making .NET a multiplatform environment.  The "new .NET" combines the power of Mono and .NET Core into a single framework that allows developers to create applications for any platform forming the basis for the launch of products such as  .NET MAUI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--18nkY765--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/v1/img/blog/2022-08-24/ReleaseCycle.png%20align%3D%22left%22" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--18nkY765--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/v1/img/blog/2022-08-24/ReleaseCycle.png%20align%3D%22left%22" alt="Release Schedule" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.NET releases in even numbers are the targetted for LTS and receive support and updates for 3 years, whilst odd number versions have short-term support for 18 months. This information is critical as it allows you to determine how far ahead you need to plan for a major upgrade of your applications and the version compatibility of your Nuget packages. &lt;/p&gt;

&lt;h2&gt;
  
  
  Notable Changes
&lt;/h2&gt;

&lt;p&gt;In this section, we will highlight the most significant changes you can expect from .NET 7. It is becoming noticeable that Short Term Release versions will have fewer major features than versions with LTS, with a majority of the focus going towards improvement and enhancement. &lt;/p&gt;

&lt;h3&gt;
  
  
  C# 11
&lt;/h3&gt;

&lt;p&gt;Every new release of .NET ships with a corresponding release of C#. Available with the &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/7.0"&gt;preview SDK&lt;/a&gt;, C# 11 comes with new features such as &lt;/p&gt;

&lt;h4&gt;
  
  
  Required members
&lt;/h4&gt;

&lt;p&gt;You can set the required modifier to properties of a class or a struct that must be initialized.&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;RequiredMember&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;required&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means that without declaring the Name variable, the compiler will throw an error.&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;using&lt;/span&gt; &lt;span class="nn"&gt;Blazorise.CSharp11.Features&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;requiredMember&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;requiredMember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"James"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the serialized attribute [SetsRequiredMember] to parse the RequiredMember parameter into the constructor and set it with init.&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;RequiredMember&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SetsRequiredMembers&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;RequiredMember&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;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&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;required&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="n"&gt;init&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;This indicates that a constructor sets all required members so callers using that constructor must initialize all required members using object initializers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Auto-default struct
&lt;/h4&gt;

&lt;p&gt;In C# 10, if a struct has a constructor, we have to set the properties within it.  In C# 11, if a property is not set, it will be set as its default value. &lt;/p&gt;

&lt;p&gt;In our example below, the number will be set to zero&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;struct&lt;/span&gt; &lt;span class="nc"&gt;AutoDefaultStruct&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;Number&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;AutoDefaultStruct&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;
  
  
  Generic Attributes
&lt;/h4&gt;

&lt;p&gt;An attribute with a generic type can be used as part of an attribute within a class as a fully constructed type.&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;Attr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&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;Attribute&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;class&lt;/span&gt; &lt;span class="nc"&gt;GenericAttribute&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Attr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;myClass&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;h3&gt;
  
  
  Extended MAUI Support and Blazor Hybrid
&lt;/h3&gt;

&lt;p&gt;At the time of writing, .NET MAUI is in preview 13. The official release of MAUI will ship with .NET 7 but based on .NET 6 with tooling and performance improvements.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suggested Reading - &lt;a href="https://dev.to/blog/a-beginners-guide-to-maui"&gt;What Is .NET MAUI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Blazor Hybrid Support allows us to take existing Blazor Components such as Blazorise (&lt;a href="https://blazorise.com/docs/components/"&gt;https://blazorise.com/docs/components/&lt;/a&gt;) or a WPF or WinForms application and bundle them into a desktop application using a webview control with access to all underlying hardware APIs. It will allow developers to use web technologies to build desktop applications with access to system resources such as the local file system or a webcam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Containerized Images
&lt;/h3&gt;

&lt;p&gt;In .NET 7, the developer's experience with building and deploying containerized applications will be simplified regarding the setup and configuration required to implement secure authentication and authorization while improving the performance of application startup and runtime execution.&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;# create a new project and move to its directory&lt;/span&gt;
    &lt;span class="s"&gt;dotnet new blazorwasm -n my-container-app&lt;/span&gt;
    &lt;span class="s"&gt;cd my-container-app&lt;/span&gt;

    &lt;span class="s"&gt;# add a reference to a (temporary) package that creates the container&lt;/span&gt;
    &lt;span class="s"&gt;dotnet add package Microsoft.NET.Build.Containers&lt;/span&gt;

    &lt;span class="s"&gt;# publish your project for linux-x64&lt;/span&gt;
    &lt;span class="s"&gt;dotnet publish --os linux --arch x64 -&lt;/span&gt;
    &lt;span class="s"&gt;p:PublishProfile=DefaultContainer&lt;/span&gt;

    &lt;span class="s"&gt;# run your app using the new container&lt;/span&gt;

    &lt;span class="s"&gt;docker run -it --rm 5010:80 my-container-app:1.0:0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also expect to see a preview of Microsoft Orleans, a cross-platform framework for distributed applications. &lt;/p&gt;

&lt;h2&gt;
  
  
  Other Improvements &amp;amp; features
&lt;/h2&gt;

&lt;p&gt;Let's take a look at some improvements enhancements in .NET 7&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Improvements
&lt;/h3&gt;

&lt;p&gt;Additional performance improvements in .NET 7 have made it faster and more efficient. Already, .Net 6 has huge improvements in performance with JIT, AOT, inlining method calls, and devirtualization, and .Net 7 will take this even further. This will improve the performance of containerized applications without altering your source code running in the cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  Official HTTP 3 Support
&lt;/h3&gt;

&lt;p&gt;Http 3 was shipped as a preview feature in .Net 6 &amp;amp; will be a part of .Net 7 &amp;amp; enabled by default. In future .Net 7 preview versions, we’ll see performance improvements &amp;amp; additional TLS features. The HTTP/3 specification isn't finalized and behavioral or performance issues may exist in HTTP/3.&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WebHost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureKestrel&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="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&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;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ListenAnyIP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;listenOptions&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;listenOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Protocols&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpProtocols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Http1AndHttp2AndHttp3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;listenOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseHttps&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;This code configures port 5001 to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use HTTP/3 alongside HTTP/1.1 and HTTP/2 by specifying

&lt;code&gt;HttpProtocols.Http1AndHttp2AndHttp3&lt;/code&gt;

.
- Enable HTTPS with

&lt;code&gt;UseHttps&lt;/code&gt;

. HTTP/3 requires HTTPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Minimal APIs Improvements
&lt;/h3&gt;

&lt;p&gt;Minimal APIs were introduced in .Net 6 to allow you to create lightweight APIs without the overhead of controllers. These APIs have seen massive improvements with the introduction of the new Microsoft.AspNetCore.OpenApi package to provide APIs for interacting with the OpenAPI specification in minimal APIs. &lt;/p&gt;

&lt;p&gt;Also, endpoint filters will allow you to implement crosscutting concerns that you can only do with controllers using action filters today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Will Blazorise Components Support .NET7
&lt;/h2&gt;

&lt;p&gt;Blazorise 1.1.0 will ship with support for .NET 7 to implement required keywords and  INumber interfaces for generic components like NumericEdit and NumericPicker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should You Migrate To .NET 7?
&lt;/h2&gt;

&lt;p&gt;Applications running in .NET Core 3.0 or 3.1 must migrate to .NET 6 at the very least, as it is the current version with LTS. Support for .NET Core 3.1 will end in December 2022.&lt;/p&gt;

&lt;p&gt;Applications written in .NET 5 should also migrate to .NET 6 as support for .NET 5 ended in May 2022.&lt;/p&gt;

&lt;p&gt;Applications running on .NET 6 do not need to migrate unless your you want to take advantage of specific features .NET7&lt;/p&gt;

&lt;p&gt;You can use the preview SDK for .NET 7 to test compatibility for your application and Nuget packages before you make migration decisions.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>dotnet7</category>
      <category>csharp</category>
      <category>blazor</category>
    </item>
    <item>
      <title>Guide: Create A Login Page In 5 Minutes Using Blazorise Components</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Mon, 08 Aug 2022 14:15:00 +0000</pubDate>
      <link>https://dev.to/jamattey/guide-create-a-login-page-in-5-minutes-using-blazorise-components-part-one-219f</link>
      <guid>https://dev.to/jamattey/guide-create-a-login-page-in-5-minutes-using-blazorise-components-part-one-219f</guid>
      <description>&lt;h1&gt;
  
  
  Guide: Create A Tabbed Login and Register Page With Blazorise
&lt;/h1&gt;

&lt;p&gt;This post will demonstrate how to use Blazorise Components to embed a login and registration form into an HTML tab. I will also show how to ensure data quality by validating form submissions. We will focus on just the structure and markup of the user interface, which is intended to demonstrate the use of Blazorise components and does not cover advanced topics such as tokens, cryptography, and hashing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a login page?
&lt;/h2&gt;

&lt;p&gt;The login page is an entry point to a web application and grants authorized users access to application resources and functionality.&lt;/p&gt;

&lt;p&gt;According to the Open Web Application Security Project Foundation Top 10, the confirmation of the user's identity, authentication, and session management is critical to protect against authentication-related attacks, which is currently no. 7 on the OWASP Top 10.&lt;/p&gt;

&lt;p&gt;Security starts with design, whether architecturally or via the UI and the structure and layout must be designed and properly implemented to ensure user information is exchanged quickly and securely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the login page
&lt;/h2&gt;

&lt;p&gt;The page is structured by using &lt;a href="https://dev.todocs/components/tab"&gt;Blazorise Tabs&lt;/a&gt; to have both the login and registration form on the same page. That way, new and existing users can be onboarded to the platform without needing to navigate to a different page.&lt;/p&gt;

&lt;p&gt;Blazorise components use semantic HTML elements and this gives meaning to both the browser and the developer. For SEO-intensive applications, semantic HTML is a better option than non-semantic elements such as &lt;code&gt;div&lt;/code&gt; and &lt;code&gt;span&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Prerequisites
&lt;/h3&gt;

&lt;p&gt;To begin, scaffold a new Blazor WebAssembly project if you already don't have any. Follow our &lt;a href="https://dev.toblog/how-to-create-a-blazorise-application-beginners-guide"&gt;How to create a Blazorise WASM application: A Beginner's Guide&lt;/a&gt; to learn how to setup &lt;a href="https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor" rel="noopener noreferrer"&gt;Blazor WASM&lt;/a&gt; with &lt;a href="https://dev.todocs/components"&gt;Blazorise components&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create A Sidebar Menu Item.
&lt;/h3&gt;

&lt;p&gt;To make sure your login page is accessible, you need to add a &lt;code&gt;&amp;lt;nav link&amp;gt;&lt;/code&gt; to your sidebar menu.&lt;/p&gt;

&lt;p&gt;You can create a new one from scratch by copy/pasting the snippet below into the &lt;strong&gt;NavMenu.razor&lt;/strong&gt; file or edit any of the preexisting div-class elements. The second option might affect other pages in the project.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-item px-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;NavLink&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-link"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"oi oi-list-rich"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;Login
    &lt;span class="nt"&gt;&amp;lt;/NavLink&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Create a razor page.
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;Pages&lt;/strong&gt; folder of your Blazor project, create a new razor file and name it &lt;strong&gt;Login.razor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copy and paste the code snippet below to create the markup.&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;Tabs&lt;/span&gt; &lt;span class="na"&gt;SelectedTab=&lt;/span&gt;&lt;span class="s"&gt;"@selectedTab"&lt;/span&gt; &lt;span class="na"&gt;SelectedTabChanged=&lt;/span&gt;&lt;span class="s"&gt;"@OnSelectedTabChanged"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Items&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Tab&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/Tab&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Tab&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Register&lt;span class="nt"&gt;&amp;lt;/Tab&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Items&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Content&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TabPanel&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Place form here
        &lt;span class="nt"&gt;&amp;lt;/TabPanel&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TabPanel&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Place Form Here.
        &lt;span class="nt"&gt;&amp;lt;/TabPanel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Content&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Tabs&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;Tabs&lt;/strong&gt; element allow users to navigate to different sections of a single-page application. We embedded the login and register forms into tabs to allow users to switch easily without creating a single page for each.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Tab&lt;/strong&gt; Items represent the various tab menus. It is used to contain the name of the tab.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Content&lt;/strong&gt; element, you can embed other elements or components to complete the markup of the tab. In our case, we will use the &lt;strong&gt;TabPanel&lt;/strong&gt; component to build out our login form and place the content of the actual login.&lt;/p&gt;

&lt;p&gt;Now define the selectedTab variable in the &lt;code&gt;@@code&lt;/code&gt; block section of the razor page.&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;@code&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;selectedTab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;OnSelectedTabChanged&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;name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;selectedTab&lt;/span&gt; &lt;span class="p"&gt;=&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;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&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;a href="https://dev.todocs/components/tab"&gt;Click here to read more about Blazorise Tabs Component&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Adding Fields
&lt;/h3&gt;

&lt;p&gt;After creating the tabs component, we have to fill it with content. Since we are building a login form, the &lt;code&gt;Field&lt;/code&gt; component will be embedded into the Tab Content element.&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;Field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@email"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter email..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@password"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Password.."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Check&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"bool"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Checked=&lt;/span&gt;&lt;span class="s"&gt;"@rememberMe"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Remember Me&lt;span class="nt"&gt;&amp;lt;/Check&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how we used the &lt;a href="https://dev.todocs/components/field"&gt;Fields component&lt;/a&gt; used to layout input elements. The purpose of the Field component is to give a form elements proper structure that includes standardized spacing like padding and margin. Without it, we would have to handle spacing manually.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can repeat the same code for the register tab and add or remove fields based on your project needs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After creating form fields, add a &lt;a href="https://dev.todocs/components/button"&gt;Button component&lt;/a&gt; to submit user input.&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;Button&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;"Color.Primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Implementing Validation
&lt;/h3&gt;

&lt;p&gt;Now that we have structured both the login and register tabs, we have to ensure that users enter the correct data. The &lt;a href="https://dev.todocs/components/validation"&gt;Validation component&lt;/a&gt; allows you to verify user inputs by finding and correcting errors such as email or password length. It guides the user to inform the correct form of data.&lt;/p&gt;

&lt;p&gt;You can either validate through method handlers or data annotations.&lt;/p&gt;

&lt;p&gt;The code snippet below illustrates how you can validate the email field using the method handlers.&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;Validations&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"@loginValidationsRef"&lt;/span&gt; &lt;span class="na"&gt;Mode=&lt;/span&gt;&lt;span class="s"&gt;"ValidationMode.Manual"&lt;/span&gt; &lt;span class="na"&gt;ValidateOnLoad=&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;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsEmail"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@email"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter email..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Feedback&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;ValidationNone&amp;gt;&lt;/span&gt;Please Enter Your Email. &lt;span class="nt"&gt;&amp;lt;/ValidationNone&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;ValidationSuccess&amp;gt;&lt;/span&gt;Email is good&lt;span class="nt"&gt;&amp;lt;/ValidationSuccess&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;ValidationError&amp;gt;&lt;/span&gt;Please Enter A Valid Email&lt;span class="nt"&gt;&amp;lt;/ValidationError&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/Feedback&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/TextEdit&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsNotEmpty"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@password"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Password.."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Check&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"bool"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Checked=&lt;/span&gt;&lt;span class="s"&gt;"@rememberMe"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Remember Me&lt;span class="nt"&gt;&amp;lt;/Check&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Validations&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add variable definitions in the &lt;code&gt;@@code&lt;/code&gt; section of the razor page&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;@code&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;name&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;email&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;password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;rememberMe&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;h2&gt;
  
  
  Final Example
&lt;/h2&gt;

&lt;p&gt;By the end, your razor page should look something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/img%2Fblog%2F2022-08-12%2Flogin-screen.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/img%2Fblog%2F2022-08-12%2Flogin-screen.png" alt="Login screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the full code that includes a register page.&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;Tabs&lt;/span&gt; &lt;span class="na"&gt;SelectedTab=&lt;/span&gt;&lt;span class="s"&gt;"@selectedTab"&lt;/span&gt; &lt;span class="na"&gt;SelectedTabChanged=&lt;/span&gt;&lt;span class="s"&gt;"@OnSelectedTabChanged"&lt;/span&gt; &lt;span class="na"&gt;Pills&lt;/span&gt; &lt;span class="na"&gt;FullWidth&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Items&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Tab&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/Tab&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Tab&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Register&lt;span class="nt"&gt;&amp;lt;/Tab&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Items&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Content&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TabPanel&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"login"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Card&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;CardTitle&amp;gt;&lt;/span&gt;
                        Welcome Back, Please Login
                    &lt;span class="nt"&gt;&amp;lt;/CardTitle&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Validations&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"@loginValidationsRef"&lt;/span&gt; &lt;span class="na"&gt;Mode=&lt;/span&gt;&lt;span class="s"&gt;"ValidationMode.Manual"&lt;/span&gt; &lt;span class="na"&gt;ValidateOnLoad=&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;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsEmail"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@email"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter email..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;Feedback&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationNone&amp;gt;&lt;/span&gt;Please Enter Your Email. &lt;span class="nt"&gt;&amp;lt;/ValidationNone&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationSuccess&amp;gt;&lt;/span&gt;Email is good&lt;span class="nt"&gt;&amp;lt;/ValidationSuccess&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationError&amp;gt;&lt;/span&gt;Please Enter A Valid Email&lt;span class="nt"&gt;&amp;lt;/ValidationError&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;/Feedback&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;/TextEdit&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsNotEmpty"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@password"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Password.."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Check&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"bool"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Checked=&lt;/span&gt;&lt;span class="s"&gt;"@rememberMe"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Remember Me&lt;span class="nt"&gt;&amp;lt;/Check&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/Validations&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;"Color.Primary"&lt;/span&gt; &lt;span class="na"&gt;Clicked=&lt;/span&gt;&lt;span class="s"&gt;"@OnLoginClicked"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;"Color.Secondary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Forgot Password&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Card&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/TabPanel&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TabPanel&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"register"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Card&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;CardTitle&amp;gt;&lt;/span&gt;
                        New Here? Create An Account
                    &lt;span class="nt"&gt;&amp;lt;/CardTitle&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Validations&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"@registerValidationsRef"&lt;/span&gt; &lt;span class="na"&gt;Mode=&lt;/span&gt;&lt;span class="s"&gt;"ValidationMode.Manual"&lt;/span&gt; &lt;span class="na"&gt;ValidateOnLoad=&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;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsNotEmpty"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@name"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Your Name"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsEmail"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@email"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Your Email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;Feedback&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationNone&amp;gt;&lt;/span&gt;Please Enter your email.&lt;span class="nt"&gt;&amp;lt;/ValidationNone&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationSuccess&amp;gt;&lt;/span&gt;Email is valid&lt;span class="nt"&gt;&amp;lt;/ValidationSuccess&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;ValidationError&amp;gt;&lt;/span&gt;Enter Valid email &lt;span class="nt"&gt;&amp;lt;/ValidationError&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;/Feedback&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;/TextEdit&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Validation&lt;/span&gt; &lt;span class="na"&gt;Validator=&lt;/span&gt;&lt;span class="s"&gt;"ValidationRule.IsNotEmpty"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldLabel&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/FieldLabel&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;TextEdit&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"@password"&lt;/span&gt; &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Password"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;FieldHelp&amp;gt;&lt;/span&gt;Password Strength: &lt;span class="nt"&gt;&amp;lt;Text&lt;/span&gt; &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;"TextColor.Danger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Strong&lt;span class="nt"&gt;&amp;lt;/Text&amp;gt;&amp;lt;/FieldHelp&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/Field&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/Validation&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/Validations&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;CardBody&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;"Color.Primary"&lt;/span&gt; &lt;span class="na"&gt;Clicked=&lt;/span&gt;&lt;span class="s"&gt;"@OnRegisterClicked"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        Create Account
                    &lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/CardBody&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Card&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/TabPanel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Content&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Tabs&amp;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="n"&gt;@code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Validations&lt;/span&gt; &lt;span class="n"&gt;loginValidationsRef&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Validations&lt;/span&gt; &lt;span class="n"&gt;registerValidationsRef&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;selectedTab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"login"&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;name&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;email&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;password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;rememberMe&lt;/span&gt;&lt;span class="p"&gt;;&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;OnLoginClicked&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="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;loginValidationsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ValidateAll&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="c1"&gt;// do the real login here&lt;/span&gt;

            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;loginValidationsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ClearAll&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;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;OnRegisterClicked&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="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;registerValidationsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ValidateAll&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="c1"&gt;// do the real login here&lt;/span&gt;

            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;registerValidationsRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ClearAll&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;h2&gt;
  
  
  Resource
&lt;/h2&gt;

&lt;p&gt;You can get the source code of the sample from the &lt;a href="https://github.com/Megabit/Blazorise-Samples" rel="noopener noreferrer"&gt;LoginPageDemo in Blazor demo on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Registration and login are essential components of web security. Form validation also helps users to submit the correct data and increases data quality in the process.&lt;/p&gt;

&lt;p&gt;This post demonstrated how to embed login and registration forms into a tab element. We also showed how you could guide users to enter the correct data into your forms using validations.&lt;/p&gt;

&lt;p&gt;From the post, we established how easy it is to build modern web functionality with Blazorise components in a few lines of code. We invite you to &lt;a href="https://blazorise.com/docs" rel="noopener noreferrer"&gt;try Blazorise components for free&lt;/a&gt; or &lt;a href="https://commercial.blazorise.com/pricing" rel="noopener noreferrer"&gt;apply for a license&lt;/a&gt; on commercial products and get assistance from a dedicated &lt;a href="https://commercial.blazorise.com/enterprise-plus" rel="noopener noreferrer"&gt;Blazorise Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>authentication</category>
      <category>blazor</category>
      <category>webdev</category>
      <category>blazorise</category>
    </item>
    <item>
      <title>A Beginner's Guide To .NET MAUI</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Wed, 27 Jul 2022 08:52:00 +0000</pubDate>
      <link>https://dev.to/jamattey/a-beginners-guide-to-net-maui-4bj7</link>
      <guid>https://dev.to/jamattey/a-beginners-guide-to-net-maui-4bj7</guid>
      <description>&lt;h2&gt;
  
  
  Excerpt
&lt;/h2&gt;

&lt;p&gt;This article provides a beginner level introduction to .NET MAUI and explores the history behind its evolution and what makes it a compelling choice for teams developing with tools in the .NET ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first heard about MAUI, I kept referring to the shape-shifter, demigod of the wind and sea and hero of men from my favourite animated movie, Moana. &lt;/p&gt;

&lt;p&gt;Initially, I thought it was Microsoft's attempt to venture into animation movies, but at during the announcement of .NET 6, i realized that MAUI is an attempt to conquer the multi-platform market with the emergence of tools such as electron.js and increase market adoption for the C# language. &lt;/p&gt;

&lt;p&gt;.NET MAUI or MAUI is a multi-platform framework for native desktop and mobile applications. &lt;/p&gt;

&lt;p&gt;MAUI is an acronym that means Multi-platform App UI and expands on its definition and what it was created to do. &lt;/p&gt;

&lt;p&gt;Similar to the demigod, MAUI is a shape-shifting UI framework that changes UI icons to match the native environments by relying on native system UI components. &lt;/p&gt;

&lt;p&gt;With MAUI, developers can build applications that run on Android, iOS, Windows and macOS, while sharing a single source code. &lt;/p&gt;

&lt;h2&gt;
  
  
  Origin of MAUI
&lt;/h2&gt;

&lt;p&gt;MAUI is a progression Microsoft's Xamarin project, which was created for cross-platform mobile application development for both Android and iOS platforms. &lt;/p&gt;

&lt;p&gt;The lines between native and cross platform developments are getting blurry with tools that help you to deploy a single codebase for different platforms.&lt;/p&gt;

&lt;p&gt;Frameworks such as React Native and Flutter have championed the cross-platform market, with Xamarin following closely behind. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Happened To Xamarin.Forms
&lt;/h2&gt;

&lt;p&gt;Xamarin was founded in 2011 and saw an increased community support because it allows developers to quickly start making apps without having to find out multiple languages.  &lt;/p&gt;

&lt;p&gt;Xamarin forms however was deprecated in November 2021 and moveit into the core product offering, starting with the discharge of .Net 6. &lt;/p&gt;

&lt;p&gt;If you previously worked with Xamarin.Forms, getting started with MAUI will be seamless as it still utilises the same c# and XAML markup language. &lt;/p&gt;

&lt;p&gt;In a subsequent blog, we will discuss how to move your Xamarin.Forms project to MAUI. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's New In MAUI
&lt;/h2&gt;

&lt;p&gt;Starting from .NET 6, MAUI comes fully integrated tooling and support in Visual Studio 2022, Visual Studio for Mac 2022 and Rider. &lt;/p&gt;

&lt;p&gt;You can either create a standalone MAUI app or a MAUI Blazor application. Further details on creating a MAUI app to follow subsequently. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Build With MAUI
&lt;/h2&gt;

&lt;p&gt;MAUI extends Xamarin.forms to build multi-platform apps. This means that with one code-base, your app can run on iOS and Android as mobile apps and at the same time run on Windows and MacOS as desktop apps. &lt;/p&gt;

&lt;p&gt;.NET MAUI provides a collection of controls that can be used to display data, initiate actions, indicate activity, display collections, pick data, and more. In addition to a collection of controls, .NET MAUI also provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An elaborate layout engine for designing pages.&lt;/li&gt;
&lt;li&gt;Multiple page types for creating rich navigation types, like drawers.&lt;/li&gt;
&lt;li&gt;Support for data-binding, for more elegant and maintainable development patterns.&lt;/li&gt;
&lt;li&gt;The ability to customize handlers to enhance the way in which UI elements are presented.&lt;/li&gt;
&lt;li&gt;Cross-platform APIs for accessing native device features. These APIs enable apps to access device features such as the GPS, the accelerometer, and battery and network states. &lt;/li&gt;
&lt;li&gt;Cross-platform graphics functionality, that provides a drawing canvas that supports drawing and painting shapes and images, compositing operations, and graphical object transforms.&lt;/li&gt;
&lt;li&gt;A single project system that uses multi-targeting to target Android, iOS, macOS, and Windows.&lt;/li&gt;
&lt;li&gt;.NET hot reload, so that you can modify both your XAML and your managed source code while the app is running, then observe the result of your modifications without rebuilding the app. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Cross-platform and multi-platform frameworks are here to stay as the lines of native platform develop get blurry with every new innovation and are a worthy alternative to rapid application development and speed to market for small teams on limited resources. &lt;/p&gt;

&lt;p&gt;This is MAUI's first stable release so we will keep an eye on updates from Microsoft with regards to future roadmap of MAUI.&lt;/p&gt;

&lt;p&gt;If you want to quickly build out rich user interfaces with MAUI Blazor, &lt;a href="https://commercial.blazorise.com/contact"&gt;reach out to our team&lt;/a&gt; and we will help you get started quickly with our &lt;a href="https://blazorise.com/docs/components"&gt;tested and production-ready UI components&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>maui</category>
      <category>dotnet</category>
      <category>crossplatform</category>
      <category>mobile</category>
    </item>
    <item>
      <title>What Is Blazor WASM?</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Tue, 19 Jul 2022 14:45:34 +0000</pubDate>
      <link>https://dev.to/jamattey/what-is-blazor-wasm-4n8</link>
      <guid>https://dev.to/jamattey/what-is-blazor-wasm-4n8</guid>
      <description>&lt;h2&gt;
  
  
  Excerpt
&lt;/h2&gt;

&lt;p&gt;This article builds on the &lt;a href="https://blazorise.com/blog/exploring-webassembly-the-underlying-technology-behind-blazor-wasm"&gt;concepts of WebAssembly as an integral part of Blazor WASM&lt;/a&gt; and explores what Blazor WASM is, how it works, the problems it solves, its features and the kind of applications it is suited for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Blazor WASM (or Blazor WebAssembly) is a single-page web application framework that allows you to build single page web applications. Built as part of the .NET Core ecosystem, Blazor uses C# to generate dynamic content for rich client-experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Blazor WASM Works
&lt;/h2&gt;

&lt;p&gt;Traditionally, all web pages are structured with HTML, styled with CSS and use Javascript to introduce dynamic interactivity. C# as a language was not built to run natively in browsers. However, with the presence of WebAssembly, the browser can now host the dotnet runtime, which makes it possible to run and execute C# Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is The Problem With Javascript in The Browser
&lt;/h2&gt;

&lt;p&gt;It is true that Javascript is the native language web browsers and can run in the frontend and backend. But is it really necessary to run c# in the browser?&lt;/p&gt;

&lt;p&gt;The following highlight the benefits of running C# in the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Stack Enablement
&lt;/h3&gt;

&lt;p&gt;The dotnet core ecosystem provides one of the most secure and most resilient server side implementations. It ranks highly among the most popular backend frameworks with its implementation of ASP.NET. &lt;/p&gt;

&lt;p&gt;By extending the .NET runtime into the browser, Microsoft enabled a true full stack experience to allow teams to use the same knowledge and class libraries they are familiar with from the c# language on both stacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier Integration
&lt;/h3&gt;

&lt;p&gt;In web development, there are developers who focus on either the client side or server side. Whilst code classes do not need to know the implementation details of other classes, developers on the client side hand need knowledge about server-side implementation, and this can sometimes prove difficult using two languages, especially when one is strongly typed and the other is not.  &lt;/p&gt;

&lt;p&gt;By using Blazor WASM, the client-side and server-side can share a common code base in the same language, which can integrate easily with each other. Client-side developers will have an understanding of server-side logic and how to seamlessly integrate and implement it. &lt;/p&gt;

&lt;h3&gt;
  
  
  Reduced Development Costs
&lt;/h3&gt;

&lt;p&gt;Programming languages take years to learn and master. As developers do not come cheap, finding and paying developers is a strategic decision for small teams. Having a team of skilled developers who can switch between client and server side applications without losing any understanding of both sides enhances collaboration which is vital for small teams. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://commercial.blazorise.com/enterprise-plus"&gt;Click here to discover how a Blazorise Mentor&lt;/a&gt; can quickly help your development teams scale up rapid application development using Blazorise Components. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Enhanced Code Reuse
&lt;/h3&gt;

&lt;p&gt;The DRY Principle is one of the simplest ways to prevent and reduce code smells and spaghetti code. By not having to rewrite new code, coupling is reduced and future changes do not affect other parts of the codebase.   &lt;/p&gt;

&lt;p&gt;Entire .NET libraries can be shared, and consumed in Blazor WASM. Making use of existing logic, functionality, and capabilities allows for developers to focus on innovating more as they're not required to re-invent the wheel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Of Blazor WASM
&lt;/h2&gt;

&lt;p&gt;Blazor WASM has a unique set of features that make it a compelling choice for client-side development. &lt;/p&gt;

&lt;h3&gt;
  
  
  Reusable Components
&lt;/h3&gt;

&lt;p&gt;With Blazor, you can create components for use across your application. Components are building blocks for a user interface such as a forms, cards, tables, grids and many more. &lt;/p&gt;

&lt;p&gt;These components can be defined once, and called multiple times. At the very core, components are a group of HTML elements that specify the structure of a site.&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;Dropdown&amp;gt;
    &amp;lt;DropdownToggle Color="Color.Primary"&amp;gt;
        Dropdown
    &amp;lt;/DropdownToggle&amp;gt;
    &amp;lt;DropdownMenu&amp;gt;
        &amp;lt;DropdownItem&amp;gt;Action&amp;lt;/DropdownItem&amp;gt;
        &amp;lt;DropdownDivider /&amp;gt;
        &amp;lt;DropdownItem&amp;gt;Another Action&amp;lt;/DropdownItem&amp;gt;
    &amp;lt;/DropdownMenu&amp;gt;
&amp;lt;/Dropdown&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above is &lt;a href="https://blazorise.com/docs/components/dropdown"&gt;dropdown menu component with Blazorise&lt;/a&gt;. This makes development easier and faster and can be called anytime you want to create a dropdown menu, without having to write lots of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hot Reload
&lt;/h3&gt;

&lt;p&gt;Hot reload triggers the browser to refresh automatically when changes are made to the code base. This helps to improve developer productivity, as they do need to restart the application to see the effects of those changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast Performance
&lt;/h3&gt;

&lt;p&gt;Blazor WASM on the first load takes a while as runtime environment and other dependancies have to be downloaded. Then onwards, Blazor WASM relies on the downloaded runtime to execute at near native speeds in the browser, making applications faster&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can Be Built With Blazor
&lt;/h2&gt;

&lt;p&gt;This section highlights some of the best use cases for Blazor&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive Web Application
&lt;/h2&gt;

&lt;p&gt;A progressive web application is an application that can be installed and run like a native application. Building PWAs helps teams provide native desktop and mobile experiences for their applications without building specifically for those environments. &lt;/p&gt;

&lt;p&gt;For small teams, Blazor can be a way to save up costs without sacrificing performance and delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Page Applications
&lt;/h3&gt;

&lt;p&gt;A single-page application (SPA) is a web application or website that interacts with the user by dynamically rewriting the current web page with new data from the web server, instead of the default method of a web browser loading entire new pages &lt;/p&gt;

&lt;p&gt;In Blazor WebAssembly, when the client makes a request, it is served up as a bit of HTML, CSS, and JavaScript — like all other web apps. The blazor.webassembly.js file bootstraps the app and starts loading .NET binaries which can be viewed coming over the wire in the browser's Network tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Offline Applications
&lt;/h3&gt;

&lt;p&gt;Because Blazor WASM downloads the runtime and dependencies on startup, most of the rendering is done on the client side. As a result, it can function well in scenarios where there is no internet or limited connection. &lt;/p&gt;

&lt;h2&gt;
  
  
  Debunking Common Misconceptions
&lt;/h2&gt;

&lt;p&gt;Just like all other SPA frameworks, Blazor WASM comes with its shortcomings. Here are a few to take note off&lt;/p&gt;

&lt;h3&gt;
  
  
  Huge Payload and Slow Initial Size
&lt;/h3&gt;

&lt;p&gt;Blazor WASM applications can get big quickly due to the runtimes required to run C# in the browser. This big size can cause the initial startup to be slow, and this can take a toll on a poor internet connection. Fortunately, this only happens once therefore subsequent loads are faster and smaller as the majority of the heavy lifting has already been done. &lt;/p&gt;

&lt;h3&gt;
  
  
  No More Javascript
&lt;/h3&gt;

&lt;p&gt;The goal of Blazor WASM is to allow C# to run in the browser, but that does not mean you will not require javascript at all. Blazor WASM cannot interact directly with the DOM or have access to Browser APIs, and as a result these need to be called using javascript, in a process called Javascript Interop. As Javascript is the native language for browsers, it will be required to access browser-based functionalities and &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Blazor helps teams build rich UI interfaces. If your team uses Blazor, &lt;a href="https://commercial.blazorise.com/contact"&gt;reach out to us&lt;/a&gt; on how we can help you speed up your development with our &lt;a href="https://commercial.blazorise.com/"&gt;production-ready UI components&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blazor</category>
    </item>
    <item>
      <title>Exploring WebAssembly, The Underlying Technology Behind Blazor WASM.</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Sat, 16 Jul 2022 08:31:46 +0000</pubDate>
      <link>https://dev.to/jamattey/exploring-webassembly-the-underlying-technology-behind-blazor-wasm-2b5i</link>
      <guid>https://dev.to/jamattey/exploring-webassembly-the-underlying-technology-behind-blazor-wasm-2b5i</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Blazorise is a component library that harnesses the power of Blazor to create rich user interfaces. These components are production grade and highly customizable and allow development teams to deliver client-side applications faster. &lt;/p&gt;

&lt;p&gt;Built as a feature of the ASP.NET ecosystem, Blazor WASM allows developers to create rich client-side applications with the same C# used with classic ASP.NET server-side applications. &lt;/p&gt;

&lt;p&gt;The key unique selling proposition of Blazor WASM is WebAssembly, which is tooted as faster than client-side javascript and the DOM. &lt;/p&gt;

&lt;p&gt;In this post, take a deeper dive into WebAssembly and explain what it is and why its integration with Blazor makes it a faster alternative to popular javascript frameworks such as React and Angular. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Is WebAssembly
&lt;/h2&gt;

&lt;p&gt;In the words of Jay Phelps “WebAssembly is neither web nor assembly”. In simple terms, WebAssembly or WASM, is a stack-based virtual machine. &lt;/p&gt;

&lt;p&gt;Breaking this even further, WebAssembly is a virtual machine that runs on a block of memory. This means that runtimes are responsible for handling operations at the stack level unlike with VMware or VirtualBox which pretend to be computers and handle operations at the CPU level.&lt;/p&gt;

&lt;p&gt;The WebAssembly binary format is a virtual machine format. Virtual machine runtimes are responsible for executing operations within, as the name implies, a virtual machine. &lt;/p&gt;

&lt;p&gt;WebAssembly was created to boost performance. It is designed to be a compilation target for low-level languages.&lt;/p&gt;

&lt;p&gt;[The WebAssembly specification (&lt;a href="https://webassembly.github.io/spec/"&gt;https://webassembly.github.io/spec/&lt;/a&gt;) maintains that the standards apply to more than just the browser host, but also to any other compliant host runtime (what the specification refers to as an embedder).&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Of WebAssembly
&lt;/h2&gt;

&lt;p&gt;Now that we have covered the basic architecture of WebAssembly, let's explore why Microsoft's decision to build Blazor WASM with WebAssembly benefits your client's user experience. &lt;/p&gt;

&lt;h3&gt;
  
  
  Speed
&lt;/h3&gt;

&lt;p&gt;The job of the most basic WebAssembly interpreter is to read operation codes and, in response, push or pop values on and off the stack. These kinds of operations are incredibly fast and efficient. A wasm interpreter can supply basic math, memory, and stack management capabilities and thus do its job very quickly and with very little overhead. &lt;/p&gt;

&lt;p&gt;This means that Blazorise components will load quickly when users visit your web application as interactions happen at near-native speeds. &lt;/p&gt;

&lt;h3&gt;
  
  
  Lightweight
&lt;/h3&gt;

&lt;p&gt;An underrated part of WebAssembly is how its operation code are processor and operating system agnostic, a functionality that means that its modules can run and be deployed anywhere, on any architecture, in any operating system (or even microkernel!), so long as the host is a valid WebAssembly runtime. &lt;/p&gt;

&lt;p&gt;This means that business logic encoded into the wasm should work anywhere, and even more importantly, the functions your wasm module imports from the host should also be able to work anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small
&lt;/h3&gt;

&lt;p&gt;WebAssembly can produce incredibly small artifacts. &lt;/p&gt;

&lt;p&gt;The deployment size for wasm is exponentially smaller than most of what we’re building today in the world of containers or serverless “bundles”, and that can have a huge impact on how we think about and plan our distributed applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secure
&lt;/h3&gt;

&lt;p&gt;Wasm code is not allowed to escape the confines of its sandbox. There are no language primitives for accessing the operating system, reading from memory that might belong to another process, communicating with a network, communicating with hardware, the kernel, or an operating system of any kind. &lt;/p&gt;

&lt;p&gt;Anything a wasm module does outside its sandbox must go through a host import, a function it asks the host to call. This means the host is free to deny that call at any time. Host imports are the lynchpin of nearly all of the actor models and cloud-native functionality. They are as powerful as they are secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What WebAssembly Is Not
&lt;/h2&gt;

&lt;p&gt;With the introduction of every new and shiny piece of technology, it’s easy to assume that it will solve all of our problems. But realistically, every new technology has shortcomings and use cases it does not favour.&lt;/p&gt;

&lt;p&gt;It’s true that we can do an amazing amount of things with WebAssembly, but hopefully, through exploring its limitations and true boundaries, you’ll have a better appreciation of exactly which problems it is ideal for solving, and which problems it can only solve with the use of additional code generation, shims, and fancy tricks.&lt;/p&gt;

&lt;p&gt;Many of the early WebAssembly technology demonstrations are full of “smoke and mirrors”—illusions or hand-waving where a lot of complexity is hidden from the viewer. As you continue to learn about WebAssembly, wasm code, and technology demonstrations, keep a keen and critical eye out for the boundaries. Watch for where the core WebAssembly stops and the duct tape, bubble gum, and mirrors start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this post, we have explored what WebAssembly is and why it makes Blazor WebAssembly a very complete option for frontend development. We highlighted the features of WASM along with a few use cases and concluded the post by explaining what WebAssembly is not and where it is not viable. &lt;/p&gt;

&lt;p&gt;In our next post, we will take a deeper dive in Blazor WebAssembly and why you should consider it for your client-side applications. &lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>blazor</category>
      <category>dotnet</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Shifting From A Product To A Platform Mindset</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Sun, 12 Jun 2022 01:03:27 +0000</pubDate>
      <link>https://dev.to/jamattey/shifting-from-a-product-to-a-platform-mindset-274e</link>
      <guid>https://dev.to/jamattey/shifting-from-a-product-to-a-platform-mindset-274e</guid>
      <description>&lt;p&gt;As product managers, we have to constantly redefine the value our products bring to the market and diversify pricing strategies.&lt;/p&gt;

&lt;p&gt;This in many cases, is difficult to execute with just one software product. By definition, a product manager is responsible for the vision and strategy of a product. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Product vision focus on the value proposition and strategy focuses on the roadmap of how to achieve that vision. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  In the case of Spotify as a use case
&lt;/h2&gt;

&lt;p&gt;Spotify is a web based platform that allows music lovers to enjoy unlimited supply of music from their favorite artistes available 24/7, whilst delivering new content to keep them engaged and find new sounds. &lt;/p&gt;

&lt;p&gt;Users can listen to music for free or pay a monthly subscription for additional features. &lt;/p&gt;

&lt;p&gt;This is the heartbeat of the Spotify platform, but the subsidy side of its platform business. I say this because the largest offering on Spotify Premium is the individual plan, which is $9.99&lt;/p&gt;

&lt;h2&gt;
  
  
  Spotify for Artistes
&lt;/h2&gt;

&lt;p&gt;A service that allows artists to connect with their fans by delivering insights on who, where and how their songs are streamed. This provides data for artistes when doing their marketing, planning tours etc. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Spotify Ad platform&lt;br&gt;
Spotify allows business to send targeted audio campaigns to users based on their location, interests and activity on the platform. &lt;/p&gt;

&lt;p&gt;Spotify partners&lt;br&gt;
Spotify grants distribution partners such as Ditto Music the ability to send music from artistes to their streaming platform. &lt;/p&gt;

&lt;p&gt;3rd Party Marketing Platforms&lt;br&gt;
Spotify also allows marketing platforms such as Linkfire, Feature.Fm the ability to track streaming data analytics using tracking links for marketing purposes on platforms such as Facebook and Google.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From the above, you immediately notice how Spotify's value proposition is spread across the other products in its platform and how each works towards the platform vision and a total service of the music industry. This way, you cannot talk about a music industry without mentioning Spotify.&lt;/p&gt;

&lt;p&gt;Stuffing your value proposition into one product leads to feature junk, value dilution and blurry product position which will be difficult to market. As a user, when you go to Spotify's streaming platform, you know what to expect. This keeps the vision in check and the strategy on point.&lt;/p&gt;

&lt;p&gt;Fact is, if you build a stand alone product that has no connection to the existing tech ecosystem, you stifle your product growth and make it difficult to cross the mystical adoption chasm. &lt;/p&gt;

&lt;p&gt;Having a value proposition that meets the demands of all these users solidifies your value proposition and establishes your competitive advantage. &lt;/p&gt;

&lt;p&gt;Bringing this to African continent, I believe one of the product that has nailed the ecosystem growth mentality is Flutterwave. &lt;/p&gt;

&lt;h2&gt;
  
  
  Flutterwave Case Study
&lt;/h2&gt;

&lt;p&gt;At its core, Flutterwave is a payment infrastructure. It allows users to perform financial transactions with users across the world. This transaction enables the exchange of value between various actors in the economy. &lt;/p&gt;

&lt;p&gt;It bridges the gap between banks, users and international remittance. This proposition as their MVP made sense, but in order to grow, they had to shift from a product to a platform. &lt;/p&gt;

&lt;h2&gt;
  
  
  Flutterwave Store
&lt;/h2&gt;

&lt;p&gt;Users send money to exchange value. This value can be a physical or digital good or a service. Whilst Flutterwave gives developers the ability to integrate their payment gateway into their websites or apps through their APIs and SDKs, 90% of users, have no business hiring developers to flush out an ecommerce website and integrate their payment into the website. &lt;/p&gt;

&lt;p&gt;The intricacies of managing an ecommerce infrastructure, something which Jumia, the biggest ecommerce platform in Africa, has being able to do is not everyone. And the Flutterwave store is a solution to that problem. &lt;/p&gt;

&lt;p&gt;It helps you to list your products, set pricing, give discounts and manage your inventory. As a small business owner, that is what you need in most cases. &lt;/p&gt;

&lt;p&gt;From a product standpoint, the Flutterwave store falls on the subsidy side of the network effect. Flutterwave does not charge for its use, but it is one effective tactic to ensure product market penetration. &lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Cards
&lt;/h2&gt;

&lt;p&gt;Virtual cards are an interesting technology. I am not an expert in the space but from a product perspective, I understand what is going on. &lt;/p&gt;

&lt;p&gt;Flutterwave like I stated earlier, is a payment infrastructure. This means that, when users receive money, Flutterwave has the ability to store it into the wallet until its is cleared by all necessary parties for eventual transfer into the target bank account. &lt;/p&gt;

&lt;p&gt;Whilst in the Flutterwave wallet, it now acts as an enabler for continuous relationship moments with the customer. By creating a virtual card, users can use their Flutterwave balance to fund their cards. These cards can then be used for online commerce, in the same way physical cards do. &lt;/p&gt;

&lt;p&gt;This way, the value keeps circulating in the Flutterwave ecosystem until it eventually makes it way out of the system. &lt;/p&gt;

&lt;p&gt;Whilst i am not affiliated to Flutterwave, using the product extensively and strategically brings me to the conclusion that some of these revelations are trade secrets and i will not like to expose them.&lt;/p&gt;

&lt;p&gt;To conclude, one of the pillars of product growth is community enablement. But for a product to further its adoption journey and foster user retention, there must be a shift to ecosystem/platform enablement. Just as Youtube users create an audience to allow Youtube content creators to create content for youtube users to consume and data from this consumption is used by advertisers to create targeted campaigns, which is where Youtube makes its money, so must you as a product (platform) manager think of best ways to create and increase the network effect of your products and activate its growth. &lt;/p&gt;

</description>
      <category>platform</category>
      <category>product</category>
      <category>productmanager</category>
    </item>
    <item>
      <title>The North Star Metrics That Establishes Product Market Fit</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Thu, 26 May 2022 23:59:49 +0000</pubDate>
      <link>https://dev.to/jamattey/the-north-star-metric-that-establishes-product-market-fit-3c54</link>
      <guid>https://dev.to/jamattey/the-north-star-metric-that-establishes-product-market-fit-3c54</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Products mentioned are purely for reference purposes. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Product management is a pool of jargon. Of all the roles available in tech, I can say with certainty that the role of a PM is the most jargonised of them all. &lt;/p&gt;

&lt;p&gt;I am not going to use this blog post to verify that statement, but if there was ever a master jargon in product management, then product market fit is that one. &lt;/p&gt;

&lt;p&gt;A simple google search will introduce you to a plethora of definitions and submissions about product market fit. &lt;/p&gt;

&lt;p&gt;Let’s apply algorithmic thinking and break the large problem into small chunks and tackle each separately to define such a vague statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product
&lt;/h2&gt;

&lt;p&gt;A product is a good or service that satisfies a need or solve a problem. Satisfying a need and solving a problem are two different things. For example, Ordering pizza through a food delivery app satisfies the need for food in my stomach at a particular time, but does not solve the problem of me not knowing how to cook.&lt;/p&gt;

&lt;p&gt;Knowing whether your product solve a problem or satisfies a need is a good place to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Market
&lt;/h2&gt;

&lt;p&gt;A market is a place or platform where products are exchanged for things of value at a price that makes sense to the buyer and seller. &lt;/p&gt;

&lt;h2&gt;
  
  
  Product Market Fit
&lt;/h2&gt;

&lt;p&gt;In my words, product market fit is a measure of how users are using and willing to pay to continue to use your product. Using and paying are in present continuous term and this satisfies the rule of thumb for the long term success of any product. &lt;/p&gt;

&lt;p&gt;By this definition, the best combination of metrics to achieve the North Star for any product are retention, recurring revenue, average spend per user and customer satisfaction. &lt;/p&gt;

&lt;p&gt;Let's dive into each of them quickly&lt;/p&gt;

&lt;h2&gt;
  
  
  Retention
&lt;/h2&gt;

&lt;p&gt;Retention is the measure of how many users continue to find use and value for your product. It is a measure of whether or not your product delivers on its value proposition and the size of problem it solves. &lt;/p&gt;

&lt;p&gt;User-related metrics such as active users and Repeat Purchase Ratio, are associated with retention but can be tricky as the usage cycle for some products as not as frequent as others. Example, in the case of Tinder, a popular dating app, i will delete or find no use for the app if i find a perfect match and we take our conversations off the app. &lt;/p&gt;

&lt;p&gt;In the case of Tinder, metrics such as time spent per user, messages sent per user would be a great measure of success.&lt;/p&gt;

&lt;p&gt;Strategies for these kind of products will vary significantly to products in the e-commerce, ride-hailing or food delivery space where users are more likely to return even after a specific value is transferred.&lt;/p&gt;

&lt;p&gt;For example, in an e-commerce space, active users, returning users, churned users, number of abandoned carts and purchase frequency are good ways to track your product market fit. &lt;/p&gt;

&lt;p&gt;A niche product such as a shoe e-commerce store may not see the same metrics as an online giant like Jumia or Amazon and both have to be approached differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recurring Revenue
&lt;/h2&gt;

&lt;p&gt;Recurring venue is the average amount of revenue earned per month per user over a period and is expected to continue into the future. Recurring revenue targets can be marginal higher or lower than projections, but can be predicted and are usually stable unless there is a shift in market dynamics.&lt;/p&gt;

&lt;p&gt;Metrics such as monthly recurring Revenue, Annual recurring revenue, Revenue churn rate can provide you some insights into the value your product brings to your users.&lt;/p&gt;

&lt;p&gt;Depending on the product and usage frequency, recurring revenues can be calculated daily, weekly, monthly, quarterly or annually. &lt;/p&gt;

&lt;h2&gt;
  
  
  Transactional Size, Volume and Frequency
&lt;/h2&gt;

&lt;p&gt;These are the biggest indicators of market size and PMF. They affect and are affected by each other due to their proximity. &lt;/p&gt;

&lt;h3&gt;
  
  
  Transaction Size
&lt;/h3&gt;

&lt;p&gt;The transactional size is the unit measure for the delivery of value. Transaction size will determine the how many users you need to achieve your revenue targets and influence the volume and frequency. &lt;/p&gt;

&lt;p&gt;A $10,000 transactional size needs only 100 users to achieve $1m MRR, unlike the 100,000 users it requires to achieve the same result for a $10 transactional size. Size of transaction will also influence the marginal revenue your company will have, especially in the event where there are multiple beneficiaries involved in a transaction. This is so common in fintech products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transaction Frequency
&lt;/h3&gt;

&lt;p&gt;Transactional frequency depicts the number of times a transaction occurs between the user and the product. Ideally, at every value exchange, there should be a transaction, to validate the user proposition.&lt;/p&gt;

&lt;p&gt;In contrast to transaction size, the frequency of purchase will be lower for $10,000 product as compared to $10 transactional size. &lt;/p&gt;

&lt;p&gt;Time between purchases and number of purchases are some of the ways to track purchase frequency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transaction Volume
&lt;/h3&gt;

&lt;p&gt;This is the total number of individual size items in a single transaction order. They can be fixed or vary depending of the transaction size.&lt;/p&gt;

&lt;p&gt;For context, take a food delivery app. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The unit price of a medium pizza is the transactional size.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If a user places an order of pizza, coke and some chicken wings, the total price of this order becomes the volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often a user places an order is the transaction frequency.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A product needs to be useful for what the market is today whilst anticipating and adapting to the changing needs of the market. &lt;/p&gt;

</description>
      <category>productmarketfit</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Creating a Django Movie Recommendation App Using Jaccard Index</title>
      <dc:creator>James Amattey</dc:creator>
      <pubDate>Mon, 28 Mar 2022 01:32:04 +0000</pubDate>
      <link>https://dev.to/jamattey/creating-a-django-movie-recommendation-app-using-jaccard-4oco</link>
      <guid>https://dev.to/jamattey/creating-a-django-movie-recommendation-app-using-jaccard-4oco</guid>
      <description>&lt;h2&gt;
  
  
  My goals for this project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Understand the key components of the django framework&lt;/li&gt;
&lt;li&gt;Describe The Basic Principles of a recommendation system&lt;/li&gt;
&lt;li&gt;Build a simple movie recommendation app, by applying Jaccard Algorithm based on content filtering mechanism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Github Repository &lt;a href="https://github.com/jamattey/Django-Movie-Recommendation" rel="noopener noreferrer"&gt;https://github.com/jamattey/Django-Movie-Recommendation&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Django Backend&lt;/li&gt;
&lt;li&gt;HTML Frontend&lt;/li&gt;
&lt;li&gt;Bootstrap CSS&lt;/li&gt;
&lt;li&gt;SQLite Database&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About Django Framework
&lt;/h2&gt;

&lt;p&gt;Django splits its application logic into the following three Model-View-Controller like components:&lt;/p&gt;

&lt;p&gt;Django Model manages data modelling and database mapping as well as business logic to process data&lt;/p&gt;

&lt;p&gt;Django View describes which data is presented, but not how it is presented. Typically, Django View delegates and renders an HTML page, which describes how the data is presented&lt;/p&gt;

&lt;p&gt;Django Template generates dynamic HTML pages to present data&lt;/p&gt;

&lt;p&gt;When a client sends a request, the Django server routes the request to the appropriate view based on the Django URL configuration and acts as a traditional Controller&lt;/p&gt;

&lt;p&gt;Django Models&lt;br&gt;
Django uses Django Models to represent database tables and map them to objects, such as process is called ORM. Django Models tries to make the developer’s life easier by abstracting databases and mapping objects and methods into tables and SQL queries automatically.&lt;/p&gt;

&lt;p&gt;You just need to define classes as Django Models, and will be later mapped to database tables accordingly. Then you can simply use Django Models API to perform CRUD on the database tables without writing a single line of SQL&lt;/p&gt;

&lt;p&gt;Django Views&lt;br&gt;
In Django, a View is essentially a Python function. Such a function takes a Web request and applies the necessary logic to generate a Web response, such as the HTML contents of a Web page, a redirect, a 404 error, an XML document, an image, or any other Web response. Often, View interacts with Django Models to get required data in the form of QuerySet or objects to generate a Web response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Django Application Development Process
&lt;/h2&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%2Fuser-images.githubusercontent.com%2F69109175%2F160310283-29de9f1f-4776-4347-8ad2-285bb6d9dad1.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%2Fuser-images.githubusercontent.com%2F69109175%2F160310283-29de9f1f-4776-4347-8ad2-285bb6d9dad1.png" alt="image"&gt;&lt;/a&gt;&lt;br&gt;
First, I created a Django project which is a container for Django apps and settings. Here, I can decide to create and add one or more Django apps to the project.&lt;/p&gt;

&lt;p&gt;In Core Development, I created Django models to model the data and created views to determine which data need to be presented to the UI. I also map the request URLs to our views so Django can forward requests to corresponding views via URLs. Then we can start designing and building the UI.&lt;/p&gt;

&lt;p&gt;This movies are populated in a CSV. The site does not host actual movies but its is a recommendation engine using regular code and a database. &lt;/p&gt;

&lt;p&gt;This recommendation engine does not use Machine Learning.......yet 😂😂&lt;/p&gt;

&lt;p&gt;To make the recommendation actually work, I needed to first mark the movies a user has watched using Django Admin site. Then I wrote a recommendation algorithm based on watched movies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marking Watched Movies In Django Admin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run Django Server&lt;/li&gt;
&lt;li&gt;visit admin url app_url/admin&lt;/li&gt;
&lt;li&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F69109175%2F160308836-62edfa21-c8cb-44fc-8cf7-fcd95f19a536.png" alt="image"&gt;&lt;/li&gt;
&lt;li&gt;Then you click into the movie entry and mark it as watched and press Save.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run make_recommendations CMD to Generate Recommendations
&lt;/h2&gt;

&lt;p&gt;For any recommendation systems, the key idea is always to come up with a good algorithm/model to predict if a specific user will like or dislike his/her unseen item, as shown in the following screenshot:&lt;/p&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%2Fuser-images.githubusercontent.com%2F69109175%2F160308950-82f01992-23fc-4bce-8adf-fa710d736c9d.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%2Fuser-images.githubusercontent.com%2F69109175%2F160308950-82f01992-23fc-4bce-8adf-fa710d736c9d.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are probably hundreds of good recommendation algorithms and can be roughly divided into two categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Content filtering based:
&lt;/h3&gt;

&lt;p&gt;The content filtering based recommendation algorithms assume you may like a new movie if you have watched very similar movies before. Or based on your user profile (like age, gender, interests), it will try to find new movies matching your profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collaborative filtering based:
&lt;/h3&gt;

&lt;p&gt;The collaborative filtering algorithms assume you may like a new movie if other users similar to you (similar profile or watched similar movies) have watched this movie.&lt;/p&gt;

&lt;p&gt;In this project, we will use content filtering based algorithm, and we will try to recommend unwatched/new movies to you if they are similar to your watched movies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do we calculate such movie similarity
&lt;/h2&gt;

&lt;p&gt;Here we will use Jaccard similarity which is probably the simplest but very effective method to calculate similarity between two sets.&lt;/p&gt;

&lt;p&gt;Jaccard Similarity is defined as the size of intersection of two sets divided by the size of union of that two sets.&lt;/p&gt;

</description>
      <category>django</category>
      <category>sqlite</category>
      <category>python</category>
      <category>algorithms</category>
    </item>
  </channel>
</rss>
