如何从Blazor @onclick方法中获取Receiver对象及循环File对象
Blazor @onclick同时获取点击目标与循环对象的解决方案
你的错误源于@onclick的lambda参数类型不匹配,Blazor中点击事件的默认参数应为MouseEventArgs,而非自定义的(object receiver, Action callback)。以下是正确实现方式:
1. Razor页面写法
在循环中,通过@onclick="e => OnRowClick(e, file)"同时传递点击事件参数和当前循环的file对象:
@foreach (var file in Files.OrderBy(a => a.Title)) { <tr class="@(file.Active ? "item-active" : "")" @onclick="e => OnRowClick(e, file)"> <!-- 行内示例元素 --> <td><input type="checkbox" /></td> <td>@file.Title</td> </tr> }
2. 后台C#方法定义
在@code代码块中定义接收MouseEventArgs和file对象的方法,通过MouseEventArgs.Target获取实际点击的DOM元素:
@code { private List<FileModel> Files { get; set; } = new(); private void OnRowClick(MouseEventArgs e, FileModel file) { // 获取实际点击的DOM元素 var clickedElement = e.Target; // 可通过元素属性判断点击目标类型(比如是否是复选框) var isCheckbox = clickedElement.TagName.Equals("INPUT", StringComparison.OrdinalIgnoreCase) && clickedElement.GetAttribute("type") == "checkbox"; // 同时使用循环中的file对象 Console.WriteLine($"操作文件:{file.Title},点击目标:{clickedElement.TagName}"); } // 示例文件模型类 public class FileModel { public string Title { get; set; } public bool Active { get; set; } } }
补充说明
MouseEventArgs.Target指向实际被点击的DOM元素,CurrentTarget则指向绑定事件的<tr>元素- 如果行内元素需要阻止触发行的点击事件(比如点击复选框时不触发行逻辑),可给该元素添加
@onclick:stopPropagation="true"
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

