在下面的代码中,当我单击按钮时,没有出现问候文本,而是引发异常:无法读取未定义的属性parentnode。我知道我可以通过多种方式解决此问题,但这是什么原因呢?为什么会这样?
@page "/"
@{
void click()
{
<h1>Hello</h1>
}
}
<button @onclick="click">Click me!</button>
正确的方法是
@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(....)
-因此会导致异常。
您的语法和方式不正确。试试这个。