如何在 Blazor 中将带有参数的 onclick 添加到按钮?

Posted

技术标签:

【中文标题】如何在 Blazor 中将带有参数的 onclick 添加到按钮?【英文标题】:How to add onclick with parameter to button in Blazor? 【发布时间】:2020-12-20 18:12:47 【问题描述】:

我在 Blazor 服务器端应用程序中有以下代码:

<div class="table-responsive">
    <table class="table">
        <thead>
            <tr>
                <th>Email</th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var applicationUser in ApplicationUsers)
            
                string userId = applicationUser.Id;
                Guid? personId = applicationUser.PersonId;

                <tr>
                    <td>@applicationUser.Email</td>
                    <td>@applicationUser.PersonName</td>
                    @if (personId != null)
                    
                        <td>
                            <button class="btn btn-block btn-primary" @onclick="() => ShowEditPersonDialog(personId)" style="color: rgb(255, 255, 255); background-color: rgb(49, 56, 215);" @type="button">Edit Person</button>
                        </td>
                    
                </tr>
            
        </tbody>
    </table>
</div>

但是:

@onclick="() =&gt; ShowEditPersonDialog(personId)"

...不起作用。由于它在组件上方加载,直到第一行上的第一个按钮(有 4 个用户 - 应加载 4 行)然后按钮无法正确呈现并引发未处理的异常:

我试过了:

@onclick="() =&gt; ShowEditPersonDialog(personId)" - 上面显示的异常 @onclick="(e) =&gt; ShowEditPersonDialog(e, personId)" - 上面显示的异常 @onclick="e =&gt; ShowEditPersonDialog(e, personId)" - 上面显示的异常 @onclick="@(e =&gt; ShowEditPersonDialog(e, personId))" - 上面显示的异常 @onclick="(e) =&gt; ShowEditPersonDialog(e)" - 上面显示的异常 @onclick="e =&gt; ShowEditPersonDialog(e)" - 上面显示的异常 @onclick="@(e =&gt; ShowEditPersonDialog(e))" - 上面显示的异常 @onclick="() =&gt; ShowEditPersonDialog()" - 上面显示的异常 @onclick=@"() =&gt; ShowEditPersonDialog(personId)" - 无法编译,语法错误 @onclick="@(() =&gt; ShowEditPersonDialog(personId))" - 上面显示的异常 onclick="() =&gt; ShowEditPersonDialog(personId)" - 编译、运行和渲染,但按钮没有响应 onclick="@(() =&gt; ShowEditPersonDialog(personId))" - 无法编译 - 无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型 onclick="(e) =&gt; ShowEditPersonDialog(e, personId)"- 编译、运行和渲染,但按钮没有响应 onclick="e =&gt; ShowEditPersonDialog(e, personId)" - 编译、运行和渲染,但按钮没有响应 onclick="@((e) =&gt; ShowEditPersonDialog(e, personId))" - 无法编译 - 无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型 onclick="@(e =&gt; ShowEditPersonDialog(e, personId))" - 无法编译 - 无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型 onclick="@(e =&gt; ShowEditPersonDialog(e))" - 无法编译 - 无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型

我到底要怎么写这个东西??我只是想要一个按钮将给定行的相关 personId 传递给 ShowEditPersonDialog 方法。

【问题讨论】:

@onclick="() =&gt; ShowEditPersonDialog(personId)" @Eliseo 导致问题中显示的异常 【参考方案1】:

将您的按钮更改为此 - 从 type="button" 中删除 @ 并使用 @onclick="@(() =&gt; ShowEditPersonDialog(personId))"

<button class="btn btn-block btn-primary" 
    @onclick="@(() => ShowEditPersonDialog(personId))" 
    style="color: rgb(255, 255, 255); background-color: rgb(49, 56, 215);" 
    type="button">Edit Person</button>

将内联按钮 css 样式移动到 css 文件中的类也很好,这样 html 标记更易于阅读:)

【讨论】:

我认为"@(()=&gt;...." 中的@ 是不必要的 不@Eliseo 它不是。考虑一下:@() - 这是一个空表达式。因此,如果 @() =&gt;@(),Blazor 将无法解析。因此第二组 () 参考:docs.microsoft.com/en-us/aspnet/core/blazor/components/… 这修复了它!谢谢,我不知道 @type="button" 是问题所在,我只是按照其他人的做法。整个解决方案将在某个时候被清理,我只是专注于让它首先工作。 @Quango,我只检查了@onclick="() =&gt; ShowEditPersonDialog(personId)"@onclick="(() =&gt; ShowEditPersonDialog(personId))",它们都对我有用——在一个非常简单的应用程序 WSAM 中——

以上是关于如何在 Blazor 中将带有参数的 onclick 添加到按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Blazor 和 NetCore 5 在电子邮件中将 razor 组件作为正文发送?

如何在 GitLab Pages 中将 Blazor WebAssembly 部署为静态站点

如何在 Blazor WebAssembly 中将 Json 结果转换为字符串?

如何在 Blazor Web Assembly 中将 c# 变量传递给 javascript

带有 php 样式 url 参数的 Blazor ( ?parameter= )

C#:如何在 Blazor Wasm 托管中将动态 Razor 组件从服务器发送到客户端?