Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Style Blazor InputFile Component

I have a Blazor Web Assembly app on dotnet 5. I've added a Microsoft.AspNetCore.Components.Forms.InputFile control to a component. This causes a "Choose Files" button to be rendered.

How can I apply a style to the button?

I'd like the style to be the same as for a bootstrap btn-primary class.

Here's what I tried:

Copied the style from bootstrap.min.css and created a new style in app.css as follows:

input {
    color: #fff;
    background-color: #007bff;
    border-color: #007bff
}

The html is:

<button class="btn btn-primary" @onclick="LoadSamples">Load Samples</button>
<InputFile multiple OnChange="HandleFileSelected" />

The result was not what I'd hoped for:

enter image description here

like image 432
Rob Bowman Avatar asked May 08 '26 20:05

Rob Bowman


2 Answers

The <InputFile> component produces a standard input file html element. So the styling is the same for that. There's various styling examples out on the web - search "css styling input file".

I just tested it with Bootstrap as included with Blazor :

<EditForm Model="model">
    <div class="input-group mb-3">
        <div class="input-group-prepend">
            <span class="input-group-text" id="inputGroupFileAddon01">Upload</span>
        </div>
        <div class="custom-file">
            <InputFile class="custom-file-input"></InputFile>
            <label class="custom-file-label" for="inputGroupFile01">Choose file</label>
        </div>
    </div>
    <InputFile></InputFile>
</EditForm>
@code {
// here just to provide a valid model as I had it in the page already from answering another question!
    public class Model
    {
        public string Email { get; set; }
    }

    private Model model { get; set; } = new Model() { Email = "[email protected]" };
}

enter image description here

like image 90
MrC aka Shaun Curtis Avatar answered May 11 '26 11:05

MrC aka Shaun Curtis


All you need is the hidden attribute on the input file tag.

Here are two simple ways to do this.

  1. The easiest by far is to put the input field inside the label. Then you don't need to use the for and id attributes. Style the label how you like and put hidden on InputFile. Done!
    <label class="load-files-label">Choose file to upload.
      <InputFile hidden
                 OnChange="@LoadFiles"
                 multiple accept=".png,.jpg,.jpeg"/>
    </label>
  1. If for some reason you can't nest the InputFile in the label, then use for on the label and id on the input.
    <label for="fileupload"
           class="load-files-label">Choose files to upload.</label>
    <InputFile id="fileupload"
               hidden
               OnChange="@LoadFiles"
               multiple
               accept=".png,.jpg,.jpeg"/>

In both cases just use hidden on the InputFile tag.

My Super Awesome styling :)

.load-files-label {
  padding: 20px;
  background-color: #f55442;
  color: white;
  border-radius: 10px;
  cursor: pointer;
  margin: 4rem;
  display: block;
}

Example Styling

like image 41
Display name Avatar answered May 11 '26 12:05

Display name