![]() |
VOOZH | about |
dotnet add package Nethereum.MudBlazorComponents --version 6.1.0
NuGet\Install-Package Nethereum.MudBlazorComponents -Version 6.1.0
<PackageReference Include="Nethereum.MudBlazorComponents" Version="6.1.0" />
<PackageVersion Include="Nethereum.MudBlazorComponents" Version="6.1.0" />Directory.Packages.props
<PackageReference Include="Nethereum.MudBlazorComponents" />Project file
paket add Nethereum.MudBlazorComponents --version 6.1.0
#r "nuget: Nethereum.MudBlazorComponents, 6.1.0"
#:package Nethereum.MudBlazorComponents@6.1.0
#addin nuget:?package=Nethereum.MudBlazorComponents&version=6.1.0Install as a Cake Addin
#tool nuget:?package=Nethereum.MudBlazorComponents&version=6.1.0Install as a Cake Tool
Blazor components in MudBlazor for simple data input for smart contracts and MUD (mud.dev) tables. Used by Nethereum code generator to create complete Blazor pages per smart contract with deployment, query, and transaction UI.
Nethereum.MudBlazorComponents provides Razor components that the Nethereum code generator uses to create full Blazor pages for smart contracts. The code generator scans contract ABIs and generates pages with these components already configured for each function.
Code Generation Integration:
When using Nethereum code generator with generatorType: "BlazorPageService", a complete Blazor page is generated per smart contract containing:
Components:
dotnet add package Nethereum.MudBlazorComponents
Or via Package Manager Console:
Install-Package Nethereum.MudBlazorComponents
Package References:
Project References:
IEthereumHostProvider abstraction)Target Framework:
Configure Nethereum code generator to generate Blazor pages using MudBlazorComponents:
[
{
"paths": ["out/ERC20.sol/Standard_Token.json"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts",
"basePath": "MyProject.Contracts",
"codeGenLang": 0,
"sharedTypesNamespace": "SharedTypes",
"sharedTypes": ["events", "errors"],
"generatorType": "ContractDefinition"
},
{
"baseNamespace": "MyProject.Contracts",
"basePath": "MyProject.Blazor",
"codeGenLang": 0,
"sharedTypesNamespace": "SharedTypes",
"generatorType": "BlazorPageService"
}
]
}
]
Generator Types:
ContractDefinition - Generates typed contract messages (DTOs, functions, events)BlazorPageService - Generates Blazor pages using MudBlazorComponentsUnityRequest - Generates Unity-compatible request classesFrom Standard_Token.json ABI, the generator creates standard_token.razor:
@using System.Numerics
@using Nethereum.UI
@using MyProject.Contracts.Standard_Token
@using MyProject.Contracts.Standard_Token.ContractDefinition
@page "/standard_token"
@rendermode InteractiveWebAssembly
@inject SelectedEthereumHostProviderService selectedHostProviderService
<MudContainer MaxWidth="MaxWidth.Medium" Class="mt-4">
<MudText Typo="Typo.h5" Class="mb-4">Standard_Token</MudText>
<MudTextField @bind-Value="ContractAddress"
Label="Standard_Token Contract Address"
Variant="Variant.Outlined"
Class="mb-4" />
<ContractDeploymentComponent TDeploymentMessage="StandardTokenDeployment"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ContractAddressChanged="ContractAddressChanged" />
<QueryFunctionComponent TFunctionMessage="AllowanceFunction"
TFunctionOutput="BigInteger"
Title="allowance"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="AllowanceQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="ApproveFunction"
Title="approve"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceRequestMethodName="ApproveRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="ApproveRequestAndWaitForReceiptAsync" />
<QueryFunctionComponent TFunctionMessage="BalanceOfFunction"
TFunctionOutput="BigInteger"
Title="balanceOf"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="BalanceOfQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="TransferFunction"
Title="transfer"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceRequestMethodName="TransferRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="TransferRequestAndWaitForReceiptAsync" />
</MudContainer>
@code {
private string ContractAddress;
private void ContractAddressChanged(string address)
{
ContractAddress = address;
}
}
The code generator supports creating shared folders for common types (structs, events, errors) across multiple contracts:
{
"sharedTypesNamespace": "SharedTypes",
"sharedTypes": ["events", "errors"]
}
This creates:
MyProject.Contracts/
SharedTypes/
Events/
TransferEventDTO.cs
Errors/
InsufficientBalanceError.cs
Standard_Token/
ContractDefinition/
StandardTokenDeployment.cs
TransferFunction.cs
Deploys smart contracts with auto-generated constructor parameter inputs.
Type Parameters:
TDeploymentMessage - Generated deployment message class (e.g., MyContractDeployment)Parameters:
[Parameter] public string Title { get; set; }
[Parameter] public SelectedEthereumHostProviderService HostProvider { get; set; }
[Parameter] public TDeploymentMessage DeploymentMessage { get; set; }
[Parameter] public string ContractAddress { get; set; }
[Parameter] public EventCallback<string> ContractAddressChanged { get; set; }
[Parameter] public Type ServiceType { get; set; }
[Parameter] public IEnumerable<Type> AdditionalEventTypes { get; set; }
Features:
From: src/Nethereum.MudBlazorComponents/ContractDeploymentComponent.razor:115
Example:
<ContractDeploymentComponent
TDeploymentMessage="ERC20Deployment"
HostProvider="HostProvider"
Title="Deploy ERC20 Token"
@bind-ContractAddress="tokenAddress"
ServiceType="typeof(ERC20Service)"
AdditionalEventTypes="new[] { typeof(TransferEventDTO), typeof(ApprovalEventDTO) }" />
Sends contract transactions with auto-generated function parameter inputs.
Type Parameters:
TFunctionMessage - Generated function message class (e.g., TransferFunction)Parameters:
[Parameter] public string Title { get; set; }
[Parameter] public string ContractAddress { get; set; }
[Parameter] public SelectedEthereumHostProviderService HostProvider { get; set; }
[Parameter] public Type ServiceType { get; set; }
[Parameter] public string ServiceRequestMethodName { get; set; }
[Parameter] public string ServiceRequestAndWaitForReceiptMethodName { get; set; }
[Parameter] public bool UseContractHandlerDirectly { get; set; }
[Parameter] public Func<object, TFunctionMessage, Task<string>> ExecuteSend { get; set; }
[Parameter] public Func<object, TFunctionMessage, Task<TransactionReceipt>> ExecuteSendAndWait { get; set; }
[Parameter] public Func<Exception, object, string> HandleCustomError { get; set; }
[Parameter] public IEnumerable<Type> AdditionalEventTypes { get; set; }
Features:
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:129
Example with Custom Execute:
<TransactionFunctionComponent
TFunctionMessage="TransferFunction"
ContractAddress="@tokenAddress"
HostProvider="HostProvider"
ExecuteSend="SendTransferAsync" />
@code {
private async Task<string> SendTransferAsync(object service, TransferFunction input)
{
var erc20 = service as ERC20Service;
return await erc20.TransferRequestAsync(input);
}
}
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:140
Queries contract view/pure functions and displays results.
Type Parameters:
TFunctionMessage - Generated function message class (e.g., BalanceOfFunction)TFunctionOutput - Return type (e.g., BigInteger, string, or custom DTO)Parameters:
[Parameter] public string Title { get; set; }
[Parameter] public string ContractAddress { get; set; }
[Parameter] public SelectedEthereumHostProviderService HostProvider { get; set; }
[Parameter] public Type ServiceType { get; set; }
[Parameter] public string ServiceMethodName { get; set; }
[Parameter] public bool UseContractHandlerDirectly { get; set; }
[Parameter] public Func<object, TFunctionMessage, Task<TFunctionOutput>> ExecuteQuery { get; set; }
[Parameter] public Func<Exception, object, string> HandleCustomError { get; set; }
[Parameter] public TFunctionMessage FunctionInput { get; set; }
Features:
From: src/Nethereum.MudBlazorComponents/QueryFunctionComponent.razor:82
Example with Custom Types:
<QueryFunctionComponent
TFunctionMessage="GetUserInfoFunction"
TFunctionOutput="UserInfoOutputDTO"
ContractAddress="@contractAddress"
HostProvider="HostProvider"
ServiceType="typeof(MyContractService)"
ServiceMethodName="GetUserInfoQueryAsync" />
Manages MUD table records (query and update).
Type Parameters:
TTableService - Generated MUD table service classParameters:
[Parameter] public string ContractAddress { get; set; }
[Parameter] public SelectedEthereumHostProviderService HostProvider { get; set; }
Features:
From: src/Nethereum.MudBlazorComponents/MudDevTableComponent.razor:15
Example:
<MudDevTableComponent
TTableService="PlayerTableService"
ContractAddress="@worldAddress"
HostProvider="HostProvider" />
Auto-discovers and displays all MUD table services in an assembly.
Parameters:
[Parameter] public string Title { get; set; }
[Parameter] public Assembly SearchAssembly { get; set; }
[Parameter] public SelectedEthereumHostProviderService HostProvider { get; set; }
[Parameter] public string ContractAddress { get; set; }
[Parameter] public EventCallback<string> ContractAddressChanged { get; set; }
Features:
ITableServiceBase implementationsMudDevTableComponent for each table serviceFrom: src/Nethereum.MudBlazorComponents/MudDevTableServicesComponent.razor:6
Example:
@using System.Reflection
<MudDevTableServicesComponent
Title="Game Tables"
SearchAssembly="typeof(PlayerTableService).Assembly"
HostProvider="HostProvider"
@bind-ContractAddress="worldAddress" />
@code {
private string worldAddress = "0x...";
}
From: src/Nethereum.MudBlazorComponents/MudDevTableServicesComponent.razor:23
Dynamically generates form inputs for struct/class types.
Features:
From: src/Nethereum.MudBlazorComponents/StructInput.razor
Generates list inputs for array parameters.
Features:
From: src/Nethereum.MudBlazorComponents/ArrayInput.razor
Displays query results and transaction receipts with formatting.
Features:
From: src/Nethereum.MudBlazorComponents/ResultOutput.razor
Formats individual values for display.
From: src/Nethereum.MudBlazorComponents/FormattedValue.razor
Discovers components with specific naming patterns and generates navigation items.
public class DynamicRouteService
{
public List<NavItem> GetGeneratedRoutes(string suffixFilter = "_gen")
{
// Scans assemblies for components ending with suffix (e.g., "_gen")
// Returns NavItem list for menu generation
}
}
Use Case: Auto-generate navigation menus for code-generated contract pages.
From: src/Nethereum.MudBlazorComponents/DynamicRouteService.cs:11
Example:
@inject DynamicRouteService RouteService
<MudNavMenu>
@foreach (var item in RouteService.GetGeneratedRoutes())
{
<MudNavLink Href="@item.Href" Icon="@item.Icon">@item.Title</MudNavLink>
}
</MudNavMenu>
While components are primarily used by the code generator, they can be used manually:
<ContractDeploymentComponent TDeploymentMessage="SoftTokenDeployment"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ContractAddressChanged="ContractAddressChanged" />
<QueryFunctionComponent TFunctionMessage="AllowanceFunction"
TFunctionOutput="BigInteger"
Title="allowance"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ServiceMethodName="AllowanceQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="ApproveFunction"
Title="approve"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ServiceRequestMethodName="ApproveRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="ApproveRequestAndWaitForReceiptAsync" />
<MudDevTableComponent TService="ItemsTableService"
ContractAddress="@ContractAddress"
HostProvider="HostProvider" />
Scans assembly and creates UI for all discovered table services:
<MudDevTableServicesComponent
Title="MUD World Tables"
SearchAssembly="typeof(PlayerTableService).Assembly"
HostProvider="HostProvider"
@bind-ContractAddress="worldAddress" />
Generated Blazor pages require MudBlazor to be configured:
// Program.cs
using MudBlazor.Services;
builder.Services.AddMudServices();
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
Generated pages inject SelectedEthereumHostProviderService:
// Program.cs
using Nethereum.Blazor;
builder.Services.AddSingleton<SelectedEthereumHostProviderService>();
For simple use cases without custom contract services:
<TransactionFunctionComponent
TFunctionMessage="TransferFunction"
ContractAddress="@tokenAddress"
HostProvider="HostProvider"
UseContractHandlerDirectly="true" />
When UseContractHandlerDirectly="true", the component uses Nethereum's generic contract handlers instead of typed service classes.
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:137
Handle contract custom errors (Solidity revert reasons):
<TransactionFunctionComponent
TFunctionMessage="TransferFunction"
ContractAddress="@tokenAddress"
HostProvider="HostProvider"
ServiceType="typeof(ERC20Service)"
HandleCustomError="FormatError" />
@code {
private string FormatError(Exception ex, object service)
{
if (ex is SmartContractCustomErrorRevertException revert)
{
var erc20 = service as ERC20Service;
var decoded = erc20.FindCustomErrorException(revert);
return $"Contract Error: {decoded?.ToString() ?? revert.Message}";
}
return ex.Message;
}
}
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:142
All transaction and deployment components include collapsible "Optional Settings" panels:
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:28
The following properties are automatically excluded from input forms as they're managed separately:
// Deployment
FromAddress, AmountToSend, Gas, GasPrice, Nonce,
MaxFeePerGas, MaxPriorityFeePerGas, TransactionType,
AccessList, AuthorisationList
// Transactions (same as above)
// Queries
FromAddress, AmountToSend, Gas, GasPrice, Nonce,
MaxFeePerGas, MaxPriorityFeePerGas, TransactionType,
AccessList, AuthorisationList
From: src/Nethereum.MudBlazorComponents/ContractDeploymentComponent.razor:223
Components use MudBlazor's default theme. Customize via MudThemeProvider:
<MudThemeProvider Theme="customTheme" />
@code {
private MudTheme customTheme = new MudTheme()
{
Palette = new PaletteLight()
{
Primary = Colors.Blue.Default,
Secondary = Colors.Green.Default
}
};
}
Issue: StructInput doesn't generate any form fields.
Solution: Ensure properties have public getters/setters and are not in the excluded list.
Issue: InvalidOperationException when using ServiceType with method names.
Solution: Verify method signature matches expected parameters:
// Transaction
Task<string> MethodNameAsync(TFunctionMessage input)
// Transaction with wait
Task<TransactionReceipt> MethodNameAsync(TFunctionMessage input, CancellationTokenSource cts)
// Query
Task<TOutput> MethodNameAsync(TFunctionMessage input)
Task<TOutput> MethodNameAsync(TFunctionMessage input, BlockParameter block)
From: src/Nethereum.MudBlazorComponents/TransactionFunctionComponent.razor:249
Issue: MudDevTableServicesComponent shows no tables.
Solution: Ensure:
ITableServiceBaseSearchAssembly parameterFrom: src/Nethereum.MudBlazorComponents/MudDevTableServicesComponent.razor:42
IEthereumHostProvider abstraction| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.