如何确保 blazor 表单按钮元素的事件处理程序 运行
How can I ensure the event handlers for my blazor form button elements run
我在大型 razor 页面项目中包含了一些 blazor web 程序集组件。
我在解决方案中添加了一个 blazor web assembly 项目,并使用以下代码将组件包含在 razor 页面上:
<component type="typeof(NewProcessForm)" render-mode="WebAssemblyPrerendered"/>
<script src="_framework/blazor.webassembly.js"></script>
当我添加 Counter 组件或任何其他组件时,页面呈现得很好,但我在表单中尝试了很多变体,但我无法捕获 onclick 事件
<span id="newreference">@(NewReference)</span>
<EditForm Model="@(process)" OnSubmit="@(AddNew)">
<button id="getref" type="submit" @onclick="@(()=>GetNewReference("new"))">Get a New Reference</button>
<textarea id="newprocess"></textarea>
<button id="addprocess" type="submit" @onclick="@(()=>AddNewProcess())">Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
@code
{
private string NewReference
protected override void OnInitialized()
{
NewReference = "No new reference.";
}
public void GetNewReference()
{
IReferences ref = new References();
NewReference = ref.GetReference(new);
//InvokeAsync(StateHasChanged);
}
public void AddNew()
{
IProcess proc = new Process();
proc.AddNew();
NewReference = "New process added.";
}
}
我已经尝试将按钮设置为 type="button"
,不使用 EditForm
标记,onclick 指令具有各种格式,所有这些都以不同的排列组合在一起。
每当单击任一按钮时,此版本都会刷新页面,并且时间显示会更新,但 @code 部分方法中的断点 none 会被命中。
我是 blazor 的新手,也是 Whosebug 的新手,但我看到人们认为没有任何好处的问题。
如果我的不好,请告诉我,以便我可以更改。
更新
我已根据@MrC aka Shaun Curtis 的精彩回答编辑了标记,但方法中的断点仍未命中。
<span id="newreference">@(NewReference)</span>
<button id="getref" @(onclick=GetNewReference("new"))>Get a New Reference</button>
<textarea id="newprocess"></textarea>
<button id="addprocess" @(onclick=AddNewProcess())>Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
返回基础代码。
- 单击按钮时计数器会增加吗?
- 你断点了吗?
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
<div class="m-2">
<button class="btn btn-primary" @onclick=this.ButtonClick>Click to Update Counter</button>
</div>
<div class="m-2">
Counter: @_counter
</div>
@code {
private int _counter = 1;
private void ButtonClick()
{
// Breakpoint here - Do you hit it?
_counter++;
}
}
你就快到了。
我知道尝试在 Whosebug 上提出正确的问题是什么感觉,我花了很长时间才弄对。
由于您希望两个按钮执行不同的操作,因此请将表单提交添加到正确的事件处理程序。
此外,为了从表单中获取数据,它具有模型 MyAwesomeProcessModel
将输入字段放入
<span id="newreference">@(NewReference)</span>
<EditForm Model="@(process)">
<button id="getref" type="submit" @onclick="@(e => GetNewReference("new"))">Get a New Reference</button>
<textarea @bind=@(process.whatevermyawesomeeprocessespropertyis)></textarea>
<button id="addprocess" type="submit" @onclick=AddNewProcess>Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
@code
{
private MyAwesomeProcessModel process;
private string NewReference;
protected override void OnInitialized()
{
NewReference = "No new reference.";
}
protected override bool ShouldRender()
{
return false;
}
public void GetNewReference()
{
IReferences ref = new References();
NewReference = ref.GetReference(new);
}
public void AddNewProcess()
{
IProcess proc = new Process();
proc.AddNew(process.whatevermyawesomeeprocessespropertyis);
NewReference = "New process added.";
}
}
此外,从 ShouldRender
方法返回 false
会停止页面刷新。
这个按钮有效:
<button @onclick="@(() => onButtonClick(true))">Click Me</button>
@if (wasTrue)
{
<h1>Made true</h1>
}
@code {
bool wasTrue = false;
protected override void OnInitialized()
{
}
public void onButtonClick(bool myBool)
{
wasTrue = true;
}
}
我在大型 razor 页面项目中包含了一些 blazor web 程序集组件。 我在解决方案中添加了一个 blazor web assembly 项目,并使用以下代码将组件包含在 razor 页面上:
<component type="typeof(NewProcessForm)" render-mode="WebAssemblyPrerendered"/>
<script src="_framework/blazor.webassembly.js"></script>
当我添加 Counter 组件或任何其他组件时,页面呈现得很好,但我在表单中尝试了很多变体,但我无法捕获 onclick 事件
<span id="newreference">@(NewReference)</span>
<EditForm Model="@(process)" OnSubmit="@(AddNew)">
<button id="getref" type="submit" @onclick="@(()=>GetNewReference("new"))">Get a New Reference</button>
<textarea id="newprocess"></textarea>
<button id="addprocess" type="submit" @onclick="@(()=>AddNewProcess())">Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
@code
{
private string NewReference
protected override void OnInitialized()
{
NewReference = "No new reference.";
}
public void GetNewReference()
{
IReferences ref = new References();
NewReference = ref.GetReference(new);
//InvokeAsync(StateHasChanged);
}
public void AddNew()
{
IProcess proc = new Process();
proc.AddNew();
NewReference = "New process added.";
}
}
我已经尝试将按钮设置为 type="button"
,不使用 EditForm
标记,onclick 指令具有各种格式,所有这些都以不同的排列组合在一起。
每当单击任一按钮时,此版本都会刷新页面,并且时间显示会更新,但 @code 部分方法中的断点 none 会被命中。
我是 blazor 的新手,也是 Whosebug 的新手,但我看到人们认为没有任何好处的问题。
如果我的不好,请告诉我,以便我可以更改。
更新
我已根据@MrC aka Shaun Curtis 的精彩回答编辑了标记,但方法中的断点仍未命中。
<span id="newreference">@(NewReference)</span>
<button id="getref" @(onclick=GetNewReference("new"))>Get a New Reference</button>
<textarea id="newprocess"></textarea>
<button id="addprocess" @(onclick=AddNewProcess())>Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
返回基础代码。
- 单击按钮时计数器会增加吗?
- 你断点了吗?
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
<div class="m-2">
<button class="btn btn-primary" @onclick=this.ButtonClick>Click to Update Counter</button>
</div>
<div class="m-2">
Counter: @_counter
</div>
@code {
private int _counter = 1;
private void ButtonClick()
{
// Breakpoint here - Do you hit it?
_counter++;
}
}
你就快到了。
我知道尝试在 Whosebug 上提出正确的问题是什么感觉,我花了很长时间才弄对。
由于您希望两个按钮执行不同的操作,因此请将表单提交添加到正确的事件处理程序。
此外,为了从表单中获取数据,它具有模型 MyAwesomeProcessModel
将输入字段放入
<span id="newreference">@(NewReference)</span>
<EditForm Model="@(process)">
<button id="getref" type="submit" @onclick="@(e => GetNewReference("new"))">Get a New Reference</button>
<textarea @bind=@(process.whatevermyawesomeeprocessespropertyis)></textarea>
<button id="addprocess" type="submit" @onclick=AddNewProcess>Add the New Process</button>
</EditForm>
@(DateTime.Now.ToString("HH:mm:ss FFF"))
@code
{
private MyAwesomeProcessModel process;
private string NewReference;
protected override void OnInitialized()
{
NewReference = "No new reference.";
}
protected override bool ShouldRender()
{
return false;
}
public void GetNewReference()
{
IReferences ref = new References();
NewReference = ref.GetReference(new);
}
public void AddNewProcess()
{
IProcess proc = new Process();
proc.AddNew(process.whatevermyawesomeeprocessespropertyis);
NewReference = "New process added.";
}
}
此外,从 ShouldRender
方法返回 false
会停止页面刷新。
这个按钮有效:
<button @onclick="@(() => onButtonClick(true))">Click Me</button>
@if (wasTrue)
{
<h1>Made true</h1>
}
@code {
bool wasTrue = false;
protected override void OnInitialized()
{
}
public void onButtonClick(bool myBool)
{
wasTrue = true;
}
}