C# 为什么submit类型的按钮会在父组件中触发OnInit

C# 为什么submit类型的按钮会在父组件中触发OnInit,c#,forms,components,eventemitter,blazor,C#,Forms,Components,Eventemitter,Blazor,有一个父组件和一个子组件,子组件有一个表单,表单有两个按钮,一个是提交,另一个是按钮。它们的onclick处理程序都调用操作,以便父组件做出响应。 在父组件中,处理从子组件发送的事件后,submit按钮触发的事件也会触发父组件上的OnInit。 为什么会发生这种情况 例如: 家长 <Child onsubmit=@((value)=>OnSubmit(value)) oncancel=@((value)=>OnCancel(value))></Chi

有一个
父组件
和一个
子组件
,子组件
有一个表单,表单有两个按钮,一个是
提交
,另一个是
按钮
。它们的
onclick
处理程序都调用
操作
,以便父组件做出响应。 在父组件中,处理从子组件发送的
事件后,
submit
按钮触发的事件也会触发父组件上的
OnInit
。 为什么会发生这种情况

例如:

家长

<Child onsubmit=@((value)=>OnSubmit(value)) 
       oncancel=@((value)=>OnCancel(value))></Child>
@functions()
{ 
  private int x=3;
  protected override void OnInit()
  {
    Console.WriteLine($"From OnInit ,x={this.x}");
  }
  protected override void OnAfterRender()
  {
    Console.WriteLine($"From AfterRender,x={this.x}");
  }
  protected void OnSubmit(int _x) 
  { 
     //lets say child sends x=7
     this.x=_x;
     Console.WriteLine($"From handler, x={this.x}");
  }
  protected void OnCancel(int _x) 
  { 
     //lets say child sends x=7
     this.x=_x;
     Console.WriteLine($"From handler, x={this.x}");
  }
}
输出(用于
按钮类型的按钮

为什么在父级处理事件后,父级上的
submit
按钮也会触发
OnInit
添加StateHasChanged();方法如下:

protected void OnEvent(int _x) 
  { 
     //lets say child sends x=7
     this.x=_x;
     // If this works, then it is a bug with Blazor...
     // If not, be patient...
     StateHasChanged();

     Console.WriteLine($"From handler, x={this.x}");
  }
如果页面刷新,则输出是正确的:每当重新加载页面时,就好像第一次运行它一样。现在,您应该了解页面刷新的原因。显示您的代码

对于您的另一个问题:在Blazor中重新呈现是由于事件(Blazor隐式调用StateHasChanged()或显式调用StateHasChanged()方法)而导致状态发生更改的组件发生的。重新渲染仅由受状态更改影响的组件完成,因此子组件可能会重新渲染,而其父组件则不会

编辑:从你下面所说的,我们现在知道为什么页面会被重新加载, 因此,每次单击submit按钮时,x的值都是3。 当然,当您单击另一个按钮时,父组件不会重新呈现,但正如我在上面已经演示的,如果您在OneEvent方法中添加对StateHasChanged()的调用,父组件将重新呈现,并且x变量将包含7

注意:您不应该使用类型属性设置为“提交”的按钮。Blazor是一个SPA框架。您不能通过提交表单(method=“post”)或将按钮的type属性设置为“submit”来发布表单数据。您应该改用Ajax(HttpClient)。据我所知,Blazor阻止表单提交:可能只有带有method=“post”和提交按钮的表单

希望这有助于。。。
如果我的答案对您有帮助,请将其标记为已接受

这是正确的输出顺序吗?从Handler,x=7//在OnInit的eventhandler中,从OnAfterRender中,x=3,x=3是的,首先它正确分配,然后,页面刷新。当
子标记关闭时,
页面进行总刷新是否正常?根据条件
@if
我应该说明我的
是一个带有两个按钮的窗体:一个按钮类型为
submit
,另一个按钮类型为
button
。它们都会向
启动事件。按钮类型为
的一个按钮不会触发
父项
From Handler,  x=7  //in parent eventhandler
From OnInit, x=3
From OnAfterRender, x=3
From Handler,  x=7  //in parent eventhandler
From OnAfterRender, x=7
protected void OnEvent(int _x) 
  { 
     //lets say child sends x=7
     this.x=_x;
     // If this works, then it is a bug with Blazor...
     // If not, be patient...
     StateHasChanged();

     Console.WriteLine($"From handler, x={this.x}");
  }