<?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: riyo singh</title>
    <description>The latest articles on DEV Community by riyo singh (@riyo_singh_1234).</description>
    <link>https://dev.to/riyo_singh_1234</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4106434%2F163339ff-c763-4bb4-b605-07d92bf558c1.png</url>
      <title>DEV Community: riyo singh</title>
      <link>https://dev.to/riyo_singh_1234</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/riyo_singh_1234"/>
    <language>en</language>
    <item>
      <title>Building a Signup Form in Blazor with Validation and API Integration</title>
      <dc:creator>riyo singh</dc:creator>
      <pubDate>Thu, 03 Sep 2026 02:54:05 +0000</pubDate>
      <link>https://dev.to/riyo_singh_1234/building-a-signup-form-in-blazor-with-validation-and-api-integration-3320</link>
      <guid>https://dev.to/riyo_singh_1234/building-a-signup-form-in-blazor-with-validation-and-api-integration-3320</guid>
      <description>&lt;h2&gt;
  
  
  Signup Form
&lt;/h2&gt;

&lt;p&gt;Here is the complete Blazor Signup form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@page "/signup"
@using System.ComponentModel.DataAnnotations
@inject HttpClient http
@inject NavigationManager navigation
@inject SweetAlertService Swal

&amp;lt;div class="d-flex justify-content-center"&amp;gt;

    &amp;lt;div class="w-25 rounded border shadow"&amp;gt;

        &amp;lt;EditForm Enhance
                  EditContext="editContext"
                  method="post"
                  FormName="Signup"
                  OnValidSubmit="SignUped"
                  class="bg-light rounded p-4 shadow-sm"&amp;gt;

            &amp;lt;DataAnnotationsValidator /&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label class="form-label"&amp;gt;Name&amp;lt;/label&amp;gt;
                &amp;lt;InputText class="form-control" @bind-Value="user.Name" /&amp;gt;
                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.Name)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;Email&amp;lt;/label&amp;gt;
                &amp;lt;InputText class="form-control" @bind-Value="user.Email" /&amp;gt;
                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.Email)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;Password&amp;lt;/label&amp;gt;

                &amp;lt;div class="d-flex flex-row"&amp;gt;
                    &amp;lt;InputText
                        type="@(IsPasswordVisible ? "password" : "text")"
                        class="form-control d-flex"
                        @bind-Value:after="OnPassChanged"
                        @bind-Value="user.Password" /&amp;gt;

                    &amp;lt;button class="btn border"
                            type="button"
                            @onclick="() =&amp;gt; IsPasswordVisible = !IsPasswordVisible"&amp;gt;

                        &amp;lt;i class="bi @(IsPasswordVisible
                            ? "bi-eye-slash"
                            : "bi-eye")"&amp;gt;
                        &amp;lt;/i&amp;gt;

                    &amp;lt;/button&amp;gt;
                &amp;lt;/div&amp;gt;

                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.Password)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;Confirm Password&amp;lt;/label&amp;gt;

                &amp;lt;InputText class="form-control"
                           @bind-Value="user.ConfirmPassword" /&amp;gt;

                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.ConfirmPassword)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;DateOfBirth&amp;lt;/label&amp;gt;

                &amp;lt;InputDate class="form-control"
                           @bind-Value="user.DateOfBirth" /&amp;gt;

                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.DateOfBirth)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;Address&amp;lt;/label&amp;gt;

                &amp;lt;InputText class="form-control"
                           @bind-Value="user.Address" /&amp;gt;

                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.Address)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="mb-3"&amp;gt;
                &amp;lt;label&amp;gt;PhoneNumber&amp;lt;/label&amp;gt;

                &amp;lt;InputText class="form-control"
                           @bind-Value="user.PhoneNumber" /&amp;gt;

                &amp;lt;ValidationMessage For="@(() =&amp;gt; user.PhoneNumber)" /&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="d-flex justify-content-around flex-row"&amp;gt;

                &amp;lt;button type="submit"
                        class="btn btn-primary"&amp;gt;
                    SignUp
                &amp;lt;/button&amp;gt;

                &amp;lt;button type="button"
                        @onclick="GoToLogin"
                        class="btn btn-link"&amp;gt;
                    Login
                &amp;lt;/button&amp;gt;

            &amp;lt;/div&amp;gt;

        &amp;lt;/EditForm&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Behind
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@code&lt;/code&gt; section contains the component's logic, API call, navigation, and validation models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@code {
    private string errorMessage = "";

    public User user = new();

    bool IsPasswordVisible = false;

    EditContext? editContext;

    protected override void OnInitialized()
    {
        editContext = new EditContext(user);
    }

    void OnPassChanged()
    {
        if (editContext is null)
        {
            return;
        }

        var ConfirmPassWordFields =
            editContext.Field(nameof(user.ConfirmPassword));

        editContext.NotifyFieldChanged(ConfirmPassWordFields);
    }

    public async Task SignUped()
    {
        var response =
            await http.PostAsJsonAsync(
                "api/Auth/signup",
                user);

        if (response.IsSuccessStatusCode)
        {
            Console.WriteLine(
                response.Content.ToString());

            navigation.NavigateTo("/login");
        }
        else
        {
            // Get error message returned by API
            var message =
                await response.Content
                    .ReadFromJsonAsync&amp;lt;ErrorResponse&amp;gt;();

            List&amp;lt;string&amp;gt; showError =
                message.Message.Split(",").ToList();

            var stringOfError = "";

            foreach (var i in showError)
            {
                stringOfError += $"{i} \n";
            }

            await Swal.FireAsync(
                new SweetAlertOptions
                {
                    Title = stringOfError,
                    Icon = SweetAlertIcon.Error
                });
        }
    }

    void GoToLogin()
    {
        navigation.NavigateTo("login");
    }

    public class User
    {
        [Required]
        [RegularExpression(
            @"^[A-Za-z\s]+$",
            ErrorMessage =
                "Only alphabets and spaces are allowed.")]
        [MaxLength(100)]
        public string Name { get; set; }

        [Required]
        [RegularExpression(
            @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",
            ErrorMessage = "Enter Valid Email")]
        [EmailAddress(
            ErrorMessage = "Invalid email address.")]
        public string Email { get; set; }

        [Required(
            ErrorMessage = "Password is required")]
        [RegularExpression(
            @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&amp;amp;])" +
            @"[A-Za-z\d@$!%*?&amp;amp;]{8,}$",
            ErrorMessage = "Enter Valid Passord")]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Required(
            ErrorMessage = "Confirm Password is required")]
        [DataType(DataType.Password)]
        [Compare(
            nameof(Password),
            ErrorMessage = "Passwords do not match")]
        public string ConfirmPassword { get; set; }

        [Required]
        [MinimumAge(18)]
        public DateOnly? DateOfBirth { get; set; }

        [Required]
        [StringLength(
            300,
            ErrorMessage =
                "Home Address cannot exceed 300 characters.")]
        public string? Address { get; set; }

        [Required]
        [RegularExpression(
            @"^\d{10}$",
            ErrorMessage =
                "Phone number must be exactly 10 digits.")]
        public string? PhoneNumber { get; set; }
    }

    public class ErrorResponse
    {
        public int Statuscode { get; set; }

        public string Message { get; set; }

        public string? Details { get; set; }

        public DateTime TimeSpent { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating a Custom Minimum Age Validation Attribute
&lt;/h2&gt;

&lt;p&gt;For the Date of Birth field, I created a custom validation attribute called &lt;code&gt;MinimumAgeAttribute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows us to validate that the user is at least 18 years old.&lt;/p&gt;

&lt;p&gt;Create a file named:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MinimumAgeAttribute.cs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.ComponentModel.DataAnnotations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Frontend.Services&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;MinimumAgeAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ValidationAttribute&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_minimumAge&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;MinimumAgeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;minimumAge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_minimumAge&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;minimumAge&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
                &lt;span class="s"&gt;$"You must be at least &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_minimumAge&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years old."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;IsValid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ValidationContext&lt;/span&gt; &lt;span class="n"&gt;validationContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// No value - let [Required] handle null&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;value&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// DateOnly? is boxed as DateOnly when it has a value&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;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="n"&gt;DateOnly&lt;/span&gt; &lt;span class="n"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Today&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Prevent future dates&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dob&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Date of birth cannot be in the future."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;validationContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MemberName&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;// Calculate age&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Year&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dob&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddYears&lt;/span&gt;&lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;--;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Check minimum age&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;_minimumAge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;ErrorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;validationContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MemberName&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;return&lt;/span&gt; &lt;span class="n"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Success&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;
  
  
  Using the Custom Attribute
&lt;/h3&gt;

&lt;p&gt;Now we can use the custom attribute on the &lt;code&gt;DateOfBirth&lt;/code&gt; property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;MinimumAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;18&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;DateOnly&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;18&lt;/code&gt; passed to &lt;code&gt;[MinimumAge(18)]&lt;/code&gt; becomes the minimum age required for the user.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MinimumAge(18)
       ↓
User enters Date of Birth
       ↓
Calculate user's age
       ↓
Is age &amp;gt;= 18?
    ↙       ↘
  Yes        No
   ↓          ↓
 Valid      Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why use a custom ValidationAttribute?
&lt;/h3&gt;

&lt;p&gt;Instead of putting the age calculation directly inside the Blazor component, we keep the validation logic in a reusable class.&lt;/p&gt;

&lt;p&gt;This makes the component cleaner and allows the same validation attribute to be reused for other models or forms.&lt;/p&gt;

&lt;p&gt;The attribute also handles an important edge case: a future Date of Birth is rejected with a specific validation message.&lt;/p&gt;

</description>
      <category>signup</category>
      <category>blazor</category>
    </item>
  </channel>
</rss>
