Blazor is a single page application framework that uses .NET running in the browser through the magic of WebAssembly and Mono. Check out How Blazor runs .NET in the browser for more information. You can think of Blazor like you do Angular or React, but written in .NET.
Please make note that this project is still an unsupported experiment and shouldn’t be used for production applications. This is part of the reason I held off on trying it until now.
I will be adding the Blazor project to my ASP.NET Core Basics repo. The code before any changes can be found here.
Getting Started
For an experiment, Blazor already has some really good docs. A lot of this post is going to mirror the Get started with Blazor docs page, but I try and document as I go. First, make sure you have the latest version of .NET Core 2.1.x SDK installed.
If you are going to be using Visual Studio you will need at least version 15.7. In addition, you will need to install the Blazor Language Services extension. From within Visual Studio, this can be done from the Tools > Extension and Updates menu. Select Online and search for Blazor. It should come up with just one item and you can click Download to start the install process.
Project Creation
We are going to use the .NET CLI to install the Blazor templates and add the resulting project to the ASP.NET Core Basics solution. First, open a command prompt and use the following command to get the Blazor template installed.
dotnet new -i Microsoft.AspNetCore.Blazor.Templates
If you are using the sample code I am running the commands from a new Blazor directory in the existing src directory. Then run the following command to create the Blazor project.
dotnet new blazor
The next command will add the new project to the existing solution. The path to the solution file isn’t required if the command is being run from the same directory as the solution file, but in our case, we are running the commands two level down from where the solution file is located.
dotnet sln "../../ASP.NET Core Basics.sln" add Blazor.csproj
At this point, you can use the following command to run the application.
dotnet run
Adding the Contact List
As with the other post in the ASP.NET Basics category, we are going to add a contact list page that pulls a list of contacts from an API. For this example, the API is part of the Contacts project that already exists in the sample solution. All the changes in the section take place in the Blazor project we created above.
In the Pages directory add a ContactList.cshtml file with the following contents. A break down of some of the parts of this file will follow.
@page "/contacts" @inject HttpClient Http <h1>Contact List</h1> @if (contacts == null) { <p><em>Loading...</em></p> } else { <table class="table"> <thead> <tr> <th>ID</th> <th>Name</th> </tr> </thead> <tbody> @foreach (var contact in contacts) { <tr> <td>@contact.Id</td> <td>@contact.Name</td> </tr> } </tbody> </table> } @functions { Contact[] contacts; protected override async Task OnInitAsync() { contacts = await Http.GetJsonAsync<Contact[]>("http://localhost:13322/api/contactsApi/"); } class Contact { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string City { get; set; } public string State { get; set; } public string PostalCode { get; set; } public string Phone { get; set; } public string Email { get; set; } } }
This has a lot going on so we are going to start with the functions
section which is essentially a way to block off code needed by the page. It can contain functions, classes, or whatever else C# construct the page may need. The following is just the functions
section of the above page.
@functions { Contact[] contacts; protected override async Task OnInitAsync() { contacts = await Http.GetJsonAsync<Contact[]>("http://localhost:13322/api/contactsApi/"); } class Contact { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string City { get; set; } public string State { get; set; } public string PostalCode { get; set; } public string Phone { get; set; } public string Email { get; set; } } }
In our sample, we are using the functions
to define a Contact
class to hold the data we get back from the API call in the OnInitAsync
function. The OnInitAsync
function is one of the lifecycle functions provided by the Blazor components. We aren’t going to dive into components, I recommend you check out the component docs for more information.
The @page "/contacts"
is defining the route that the page will be served for. Next, @inject HttpClient Http
is showing how to use ASP.NET Core’s dependency injection to get an instance of an HttpClient
.
The remaining bit of the file is normal Razor. Everything defined in the functions
section is available for use in your layout. For example, we are using the list of contacts filled by the OnInitAsync
to loop and create a table to display our contact list.
<h1>Contact List</h1> @if (contacts == null) { <p><em>Loading...</em></p> } else { <table class="table"> <thead> <tr> <th>ID</th> <th>Name</th> </tr> </thead> <tbody> @foreach (var contact in contacts) { <tr> <td>@contact.Id</td> <td>@contact.Name</td> </tr> } </tbody> </table> }
Wrapping Up
Blazor is a very interesting concept. I hope it is able to make it through the experimental phase into a supported project. It seems like it would be a great option for .NET developers. It was a lot of fun to finally try out. Go give it a try and make sure and provide feedback to Microsoft so they can make an informed decision on how to proceed with the project.
The finished code can be found here.
Also published on Medium.