【问题标题】:Blazor : call a method without button clickBlazor:调用没有按钮单击的方法
【发布时间】:2021-11-27 13:44:09
【问题描述】:

我正在学习 Razor。我在Budget.razor 中有一个非常简单的 Razor 组件(使用 MudBlazor 框架)

@page "/budget"

<PageTitle>Budget</PageTitle>

<MudGrid>
    <MudItem xs="12" sm="6" md="4">
        <p> Hello you @HelloConsole() </p>
        </MudItem>
</MudGrid>

Budget.razor.cs 中的部分类:

namespace MyProject.Pages
{
   public partial class Budget
    {
        protected void HelloConsole()
        {
            Console.WriteLine("Hello");
        }
    }
}

我在 Visual Studio 中收到错误:

Cannot implicitly convert type 'void' to 'object'

我做错了什么?

【问题讨论】:

  • 我不知道 blazor,但我认为你应该将方法改为 protected string HelloConsole(){return “Hello;”}
  • 我真的很想明白为什么它在不改变实际实现的情况下不起作用
  • 因为现有的实现它期望方法返回一些东西,并且默认它是对象。它的值将在运行时呈现。您当前的方法是返回 void 而不是任何对象
  • 在我的实现中哪里可以看到它需要一个对象?还是在 Blazor 的实现中的某个地方?
  • 具有@HelloConsole 的行正在调用HelloConsole 方法

标签: c# blazor


【解决方案1】:
<p> Hello you @HelloConsole() </p>

说把HelloConsole()方法的输出放在这里。但是HelloConsole 返回一个 void - 正是错误所说的 - 渲染器无法处理。

这行得通:

protected string HelloConsole()
{
   Console.WriteLine("Hello");
   return "I just wrote to the console";
}

补充回答:

在加载组件时执行一些代码:

protected override void OnInitialized()
{
   Console.WriteLine("Hello");
}
// or

protected override Task OnInitializedAsync()
{
   Console.WriteLine("Hello");
   return Task.CompletedTask;

}

【讨论】:

  • 所以@ 指令并不意味着“执行这个”?
  • 渲染过程将显示它所指向的任何内容。如果它是一个属性,它将调用getter,如果它是一个字段,它将输出该字段,如果它是一个方法,它将调用该方法并显示返回值。它需要一个对象并将其显示为字符串。
  • 好的,所以在 blazor 中不可能只说“执行这个”而不期待其他任何事情吗?我知道这是很理论上的,但鉴于我偶然发现了这一点,我想借此机会真正了解它
  • 当然,如果您希望它只运行代码,那么您可以将该逻辑放入任何生命周期事件中,例如OnInitialized。如果您希望某些东西与模板一起使用,它需要提供渲染器可以解释的东西。有关生命周期事件的文档可能对您有所帮助:docs.microsoft.com/en-us/aspnet/core/blazor/components/…
  • @FenryrMKIII 查看我的更新答案
【解决方案2】:

您需要作为匿名 lambda 执行,否则它将期望返回字符串/对象:

这应该可行:

@page "/budget"

<PageTitle>Budget</PageTitle>

<MudGrid>
    <MudItem xs="12" sm="6" md="4">
        <p> Hello you @(() => HelloConsole()) </p>
        </MudItem>
</MudGrid>

protected void HelloConsole()
{
    Console.WriteLine("Hello");
}

【讨论】:

    【解决方案3】:

    您正在向控制台写入数据。 Blazor 标记需要一个对象(因为它基本上呈现一组字符串)。更改代码以返回“Hello”。这会起作用的。

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2021-04-18
      • 2019-07-13
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多