.net - Mudblazor - 如何在 MudTable 上使用 InputFile?

标签 .net blazor mudblazor

我正在尝试为使用 MudTable 显示的对象列表的每个元素添加图像上传功能。以下是我尝试的方法:

<MudTable Items="Data" Dense="true">
    <HeaderContent>
        <MudTh>Value</MudTh>
        <MudTh>Image</MudTh>
        <MudTh>Delete</MudTh>
    </HeaderContent>
    <RowTemplate Context="aa">
        <MudTd DataLabel="Value">
            <MudTextField @bind-Value="@aa.Value" For="@(()=>aa.Value)" HelperText="Required" />
        </MudTd>
        <MudTd DataLabel="Image">
            <div>
                <MudImage Src="@aa.ImageBase64" Height="50" Width="50" Elevation="25" Class="rounded my-2"></MudImage>
                <InputFile id="fileInput" OnChange="@((e)=> OnFileChange(aa,e))" hidden multiple accept=".jpg, .jpeg, .png"/>
                <MudButton HtmlTag="label"
                       Variant="Variant.Filled" Color="Color.Primary"
                       StartIcon="@Icons.Filled.CloudUpload"
                       for="fileInput">
                    Upload Image
                </MudButton>
            </div>
        </MudTd>
        <MudTd>
            <MudIconButton OnClick="@(()=>DeleteAnswer(aa))" Icon="@Icons.Filled.Delete" />
        </MudTd>
    </RowTemplate>
</MudTable>

Mudblazor 的文件上传实现的特点是它使用带有特定 id 的隐藏 InputFile。因此,如果我将其放在表格上,则该 InputFile 的实例仅对第一个元素有效,因此,如果单击第二个元素的“上传图像”按钮,则被修改的将是第一个元素,不是当前的第二个元素。

我知道我应该将 InputFile 放在 MudTable 之外,但问题是,我需要在 OnChange 上传递每个元素的实例InputFile 的 code> 事件。 我想到的另一种选择是不将 Upload Image ButtonInputFile 链接,而是在单击按钮时将当前元素的实例传递给变量。然后手动调用隐藏的InputFile的点击事件。但我想避免这种情况,那么有什么建议可以更好地做到这一点吗?

最佳答案

您可以为表中的每个行项目定义一个InputFile。请务必使用唯一的 idfor 值:

<RowTemplate>
  ...
  <MudTd DataLabel="Image">
    <InputFile
      id="@($"file-{context.Id}")"
      OnChange="@(e => this.UploadFiles(e, context))"
      hidden
      multiple />
    <MudFab
      HtmlTag="label"
      Color="@Color.Success"
      Icon="@Icons.Filled.AttachFile"
      Size="@Size.Small"
      for="@($"file-{context.Id}")"/>
  </MudTd>
</RowTemplate>

工作演示:

<MudTable Items="@this.items" Class="mt-5">

  <HeaderContent>
    <MudTh>Id</MudTh>
    <MudTh>Name</MudTh>
    <MudTh>Images</MudTh>
    <MudTh></MudTh>
  </HeaderContent>

  <RowTemplate>
    <MudTd DataLabel="Id">
      @context.Id
    </MudTd>
    <MudTd DataLabel="Name">
      @context.Name
    </MudTd>
    <MudTd DataLabel="Images">
      @context.Images
    </MudTd>
    <MudTd DataLabel="Image">
      <InputFile
        id="@($"file-{context.Id}")"
        OnChange="@(e => this.UploadFiles(e, context))"
        hidden
        multiple />
      <MudFab
        HtmlTag="label"
        Color="@Color.Success"
        Icon="@Icons.Filled.AttachFile"
        Size="@Size.Small"
        for="@($"file-{context.Id}")"/>
    </MudTd>
  </RowTemplate>

</MudTable>

@code {
  private List<Item> items = new();
  private List<IBrowserFile> files = new();

  protected override void OnInitialized()
  {
    this.items = new List<Item>
    {
      new() { Id = "123", Name = "something" },
      new() { Id = "456", Name = "another" }
    };
  }

  private void UploadFiles(InputFileChangeEventArgs e, Item item)
  {
    item.Images = string.Join(", ", e.GetMultipleFiles().Select(f => f.Name));
  }

  public class Item
  {
    public string Id { get; set; }

    public string Name { get; set; }

    public string Images { get; set; } = string.Empty;
  }
}

enter image description here

在线尝试:https://try.mudblazor.com/snippet/wumGuBvXQJffyjIA

关于.net - Mudblazor - 如何在 MudTable 上使用 InputFile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73011559/

相关文章:

c# - StateHasChanged/this.StateHasChanged 似乎对 Blazor 组件没有影响

c# - 从其他域获取用户AD组

.net - 选择是否对 F# 中的小型 AST 使用可区分联合或记录类型

c# - 为什么 NotifyCollectionChangedEventArgs 有 NewItems 和 OldItems 作为复数?

c# - 加载 Blazor 客户端应用程序时如何避免浏览器中的 System.TypeLoadException 未处理异常

c# - MudBlazor 树达到 4 级时速度非常慢

c# - SandcaSTLe 是否可以配置为生成 SEO 友好的页面和链接?

c# - Blazor - app.UseIdentityServer();使用 .pfx key 文件 - 解析数字时遇到意外字符

blazor - 将带有 html 标签的纯文本转换为 html 字符串并在 Blazor 中呈现它

c# - MudBlazor UI 库颜色