0 Files:
<MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.CloudUpload" for="@context.Id"> Upload Files </MudButton> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <ButtonTemplate> <MudFab HtmlTag="label" Color="Color.Secondary" StartIcon="@Icons.Material.Filled.Image" Label="Load picture" for="@context.Id" /> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <ButtonTemplate> <MudFab HtmlTag="label" Color="Color.Success" StartIcon="@Icons.Material.Filled.AttachFile" for="@context.Id" /> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles"> <ButtonTemplate> <MudIconButton HtmlTag="label" Color="Color.Info" Icon="@Icons.Material.Filled.PhotoCamera" for="@context.Id"> </MudIconButton> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" FilesChanged="UploadFiles" Disabled> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" for="@context.Id"> Disabled Button </MudButton> </ButtonTemplate> </MudFileUpload> @if (files != null) { <MudText Typo="@Typo.h6">@files.Count() File@(files.Count() == 1 ? "" : "s"):</MudText> <MudList> @foreach (var file in files) { <MudListItem Icon="@Icons.Material.Filled.AttachFile" @key=""> @file.Name <code>@file.Size bytes</code> </MudListItem> } </MudList> }
@code { IList<IBrowserFile> files = new List<IBrowserFile>(); private void UploadFiles(IBrowserFile file) { files.Add(file); //TODO upload the files to the server } }
Multiple and Accept
Allow multiple files with T="IReadOnlyList<IBrowserFile>"
or limit the valid file types with Accept
.
To upload more than 10 files, you must specify a MaximumFileCount
.
<MudFileUpload T="IReadOnlyList<IBrowserFile>" FilesChanged="UploadFiles"> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.CloudUpload" for="@context.Id"> Multiple Files </MudButton> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" Accept=".pdf" FilesChanged="UploadFiles2" MaximumFileCount="100"> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.CloudUpload" for="@context.Id"> Only .pdf files </MudButton> </ButtonTemplate> </MudFileUpload> <MudFileUpload T="IBrowserFile" Accept=".png, .jpg" FilesChanged="UploadFiles2" MaximumFileCount="100"> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.CloudUpload" for="@context.Id"> Only image files </MudButton> </ButtonTemplate> </MudFileUpload> @if (files != null) { <MudList> @foreach (var file in files) { <MudListItem Icon="@Icons.Material.Filled.AttachFile"> @file.Name <code>@file.Size bytes</code> </MudListItem> } </MudList> }
@code { IList<IBrowserFile> files = new List<IBrowserFile>(); private void UploadFiles(IReadOnlyList<IBrowserFile> files) { foreach (var file in files) { this.files.Add(file); } //TODO upload the files to the server } private void UploadFiles2(IBrowserFile file) { files.Add(file); //TODO upload the files to the server } }
Form Validation
Use the For
property to validate your files within a form, and bind your files to your model class using @bind-Files
.
You can then handle the file upload logic within your MudForm
submit method.
The ButtonTemplate
property provides the @context.Actions.ClearAsync
action that you can bind to a button to clear files and update the form state.
@using FluentValidation @using Severity = MudBlazor.Severity @inject ISnackbar Snackbar <MudCard> <MudForm Model="" @ref="" Validation="@(ValidationRules.ValidateValue)" ValidationDelay="0"> <MudCardContent> <MudTextField @bind-Value="model.Name" For="@(() => model.Name)" Immediate="true" Label="Name" /> <MudFileUpload T="IBrowserFile" For="@(() => model.File)" @bind-Files="model.File" OnFilesChanged="UploadFiles" SuppressOnChangeWhenInvalid="SuppressOnChangeWhenInvalid"> <ButtonTemplate> <MudButton HtmlTag="label" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.CloudUpload" for="@context.Id"> Upload Files </MudButton> <MudButton OnClick="@context.Actions.ClearAsync" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Clear"> Clear Files </MudButton> </ButtonTemplate> </MudFileUpload> </MudCardContent> <MudCardActions> <MudSwitch Color="Color.Primary" @bind-Value="SuppressOnChangeWhenInvalid">Suppress OnChange When Invalid</MudSwitch> <MudButton Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto" OnClick="@(async () => await Submit())">Submit</MudButton> </MudCardActions> </MudForm> </MudCard>
@code { private MudForm form; private FileModel model = new(); private FileModelFluentValidator ValidationRules = new(); private bool SuppressOnChangeWhenInvalid; private void UploadFiles(InputFileChangeEventArgs e) { //If SuppressOnChangeWhenInvalid is false, perform your validations here Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter; Snackbar.Add($"This file has the extension {model.File.Name.Split(".").Last()}", Severity.Info); //TODO upload the files to the server } private async Task Submit() { await form.Validate(); if (form.IsValid) { Snackbar.Add("Submitted!"); } } public class FileModel { public string Name { get; set; } public IBrowserFile File { get; set; } } /// <summary> /// A standard AbstractValidator which contains multiple rules and can be shared with the back end API /// </summary> /// <typeparam name="OrderModel"></typeparam> public class FileModelFluentValidator : AbstractValidator<FileModel> { public FileModelFluentValidator() { RuleFor(x => x.Name) .NotEmpty() .Length(1, 100); RuleFor(x => x.File) .NotEmpty(); When(x => x.File != null, () => { RuleFor(x => x.File.Size).LessThanOrEqualTo(10485760).WithMessage("The maximum file size is 10 MB"); }); } public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) => { var result = await ValidateAsync(ValidationContext<FileModel>.CreateWithOptions((FileModel)model, x => x.IncludeProperties(propertyName))); if (result.IsValid) return Array.Empty<string>(); return result.Errors.Select(e => e.ErrorMessage); }; } }