首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Blazor中,我可以动态创建一个文件输入而不将它附加到DOM上吗?(选择文件按钮)

在Blazor中,我可以动态创建一个文件输入而不将它附加到DOM上吗?(选择文件按钮)
EN

Stack Overflow用户
提问于 2022-11-14 10:13:49
回答 1查看 18关注 0票数 0

我想要实现的是相当于这个Javascript:一个按钮,可以选择一个文件,并处理该文件。

代码语言:javascript
复制
document.querySelector("button").addEventListener("click", () => {
  const input = document.createElement("input");
  input.type = "file";
  input.onchange = () => alert("You picked: " + input.files[0]?.name);
  input.click();
});
代码语言:javascript
复制
<button>Pick File</button>

我尝试创建一个InputFile,但是没有引用(Id和上下文是null的):

代码语言:javascript
复制
    <div class="text-center mt-5">
        <button class="btn btn-primary" @onclick="@this.AddFiles">
            @("AddFiles".Loc())
        </button>
    </div>
代码语言:javascript
复制
    async Task AddFiles()
    {
        var input = new InputFile();
        await this.Js.InvokeVoidAsync("triggerClick", input.Element);
        // triggerClick is a Javascript method that click the element
    }

我目前的解决方法是将一个不可见的input附加到DOM中,即使这样也不太简单:

代码语言:javascript
复制
    @inject IJSRuntime Js;

    <div class="text-center mt-5">
        <button class="btn btn-primary" @onclick="this.AddFiles">
            @("AddFiles".Loc())
        </button>
    </div>

    @if (this.fileRequested)
    {
        <InputFile @ref="this.txtFile" OnChange="this.OnFileChanged" class="d-none" />
    }
代码语言:javascript
复制
    bool fileRequested = false;
    InputFile? txtFile;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (this.fileRequested && this.txtFile is not null)
        {
            await this.Js.InvokeVoidAsync("triggerClick", this.txtFile.Element);
        }
    }

    async Task AddFiles()
    {
        this.fileRequested = true;
    }

    async Task OnFileChanged(InputFileChangeEventArgs e)
    {
        this.fileRequested = false;

        await this.Js.InvokeVoidAsync("alert", "You picked: " + e.File?.Name);
    }
EN

回答 1

Stack Overflow用户

发布于 2022-11-14 13:02:18

你可以试试这个:

代码语言:javascript
复制
 <InputFile id="filePickerId" OnChange="this.OnFileChanged" class="d-none"></InputFile>


<label for="filePickerId">
    <button type="button" style="pointer-events: none;">Pick a file</button>
</label>



async Task OnFileChanged(InputFileChangeEventArgs e)
    {
        await this.Js.InvokeVoidAsync("alert", "You picked: " + e.File?.Name);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74429992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档