【问题标题】:Blazor Cannot read the property parentnode of undefinedBlazor 无法读取未定义的属性父节点
【发布时间】:2020-09-18 20:58:39
【问题描述】:

在下面的代码中,当我单击按钮时,它没有出现 hello 文本,而是抛出异常:Cannot read the property parentnode of undefined.我知道我可以通过多种方式解决它,但这是什么原因呢?为什么会这样?

@page "/"

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

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

【问题讨论】:

    标签: c# html asp.net-core blazor blazor-server-side


    【解决方案1】:

    正确的做法是

    @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(....) - 因此会导致异常。

    【讨论】:

    • 我知道这种方式,我没有要求解决方案。我只是想知道为什么会发生这个异常。
    • @MahanLameie 答案已更新,包括您的示例无法运行的原因。
    • 这就是我需要的。谢谢你的回答。
    【解决方案2】:

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

    @page "/"
    <h1>@text</h1>
    
    <button @onclick="@click">Click me</button>
    
    @code 
    {
         private string text;
    
         private void click()
         {
              text = "Hello";
         }
    }
    

    【讨论】:

    • 我知道这种方式,我没有要求解决方案。我只是想知道为什么会发生这个异常。
    • 因为以'@code'开头的代码部分包含C#代码。但是您的点击方法包括html代码。构建代码时没有出错很奇怪,应该有类似“错误 CS0103 The name '__builder' does not exist in the current context”的错误
    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2018-04-17
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多