Blazor无法读取未定义的属性父节点

问题描述 投票:1回答:2

在下面的代码中,当我单击按钮时,没有出现问候文本,而是引发异常:无法读取未定义的属性parentnode。我知道我可以通过多种方式解决此问题,但这是什么原因呢?为什么会这样?

@page "/"

@{
    void click()
    {
        <h1>Hello</h1>
    }
}

<button @onclick="click">Click me!</button>
c# html asp.net-core blazor blazor-server-side
2个回答
2
投票

正确的方法是

@page "/"

@if (ShowH1)
{
  <h1>Hello</h1>
}

<button @onclick="Click">Click me!</button>

@code
{
  bool ShowH1 = false;

  void Click()
  {
    ShowH1 = !ShowH1;
  }
}

您的代码无法正常工作的原因是,您的.razor文件(@code之外)中的所有标记都被转换为C#,从而覆盖了BuildRenderTree

BuildRenderTreee传递给参数RenderTreeBuilder __builder进行渲染。您的方法正在作为嵌入式方法进行转译,像这样]

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    void click()
    {
        __builder.AddMarkupContent(0, "\t\t");
        __builder.AddMarkupContent(1, "<h1>Hello</h1>\r\n");
    }

    __builder.AddMarkupContent(2, "\r\n");
    __builder.OpenElement(3, "button");
    __builder.AddAttribute(4, "onclick", ... call our click method));
    __builder.AddContent(5, "Click me!");
    __builder.CloseElement();
}

所以在这里您看到按钮调用了我们的嵌入式click方法,该方法捕获了在组件渲染时传递的__builder参数。

但是__builder仅在渲染时有效。当您的用户单击按钮时,__ builder现在无效,但是您的代码对其执行了__builder.AddMarkupContent(....)-因此会导致异常。


3
投票

您的语法和方式不正确。试试这个。

© www.soinside.com 2019 - 2024. All rights reserved.