【问题标题】:How Do I Dynamically Add onclick on a Razor page?如何在 Razor 页面上动态添加 onclick?
【发布时间】:2021-12-27 05:09:48
【问题描述】:

我正在遍历一个大型对象列表,所有这些对象都将打开同一个模式窗口,该窗口将加载动态信息。为了完成这项工作,我创建了一个名为 MenuCounter 的计数器,我知道它的增量很好。

也就是说,我正在尝试在我需要使用的图标周围加上一个超链接,并且该方法的注入一直指向 MenuCounter 的最后一个值。

我第一次尝试这个:

<a href="#" onclick="@(() => SetupChangeName(MenuCounter))" class="menuButton">...</a>

当我遇到问题时,我尝试将代码缩减为以下代码,但随后页面以某种方式激活了超链接,并且模式窗口出现并且不会消失。

<a href="#" onclick="SetupChangeName(MenuCounter)" class="menuButton">...</a>

有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 请澄清:SetupChangeName 是 C# 还是 JS 函数?
  • [礼貌 :-)] 除了对 99% 的上下文代码做出一些严肃/疯狂的假设之外,您能否为您的问题提供一个可重现的示例。没有上下文的两个锚点不是很有帮助!

标签: html asp.net razor blazor razor-pages


【解决方案1】:

您应该将 lambda 表达式应用于 Blazor @onclick 指令,而不是使用 onclick Html 属性,在这种情况下,它应该调用 JS 函数,这不是您的意思。

请注意,我引入了一个新指令来防止锚元素的默认操作:@onclick:preventDefault

测试这段代码:

@page "/"


<a href="#" @onclick:preventDefault @onclick="@(() => SetupChangeName(MenuCounter))" >Click me...</a>

 <div>Counter is @output</div>
@code
{
    private int MenuCounter = 10;
    private int output;

    private void SetupChangeName (int counter)
    {
        output = counter;
    }
}

注意:如果使用 for 循环来呈现锚元素列表,则必须在循环中定义一个局部变量,并将其作为 lambda 表达式的输入,如下所示:

@for(int MenuCounter = 0; MenuCounter < 10; MenuCounter++)
{
   int local= MenuCounter; 
   <a href="#" @onclick:preventDefault @onclick="@(() => 
       SetupChangeName(local))" >Click me...</a> 
}

否则,所有 lambda 表达式都将具有相同的 MenuCounter 值,这是最后一次迭代增加的值。请参阅 For loop not returning expected value - C# - Blazor 解释问题。

【讨论】:

  • 非常感谢您的回答!我是一名后端编码员,是一家网络初创公司的所有者,自从我手动编写 HTML 以来,我就没有在前端编码过!构建中间件是个笑话,但在上周之前我什至从未听说过 Blazor/Razor。我非常尊重您的专业知识!
【解决方案2】:

我不是onclick属性的粉丝,但是如果你设置了这个方法,我相信你只需要像这样在同一行中清理C#和JS:

<a href="#" onclick="SetupChangeName('@MenuCounter')" class="menuButton">...</a>

添加引号将确保 JS 至少存在一个空字符串,然后您可以对其进行处理。

替代方法

由于混合这样的语言非常令人沮丧,我发现使用数据标签更容易,例如

<a href="#" data-menu-counter="@MenuCounter" class="menuButton">...</a>

然后在你的 JS 文件中:

var links = document.querySelectorAll('[data-menu-counter]');
links.forEach(x => x.addEventListener('click', /* your function code here */);

【讨论】:

  • 是的 - 我是一名后端编码员,所有这些前端代码对我来说都是希腊语,我只是在忍受,直到我能够为我的创业公司获得资金并将这项工作交给真正的专家。跨度>
  • @Ken Tola,我原本也是一名后端编码员,一开始转入前端并不容易……难度要大得多。然而,如今,像 Blazor 这样的框架旨在使用他们在后端使用的语言(例如 C#)将后端用户代码制作到 Web 上。
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2021-06-26
  • 2018-08-05
  • 2020-10-05
相关资源
最近更新 更多