将特定于页面的事件处理程序附加到 Blazor 服务器中的注入服务
Attaching page specific event handlers to an injected service in Blazor server
我对 Blazor 服务器非常陌生,一般都在试验网页,但无法弄清楚如何将事件处理程序正确附加到应根据当前页面触发不同操作的模态。我只是希望能够在提交时将页面信息作为电子邮件发送,但它最终会发送所有呈现的页面电子邮件,因为它认为每个事件都已触发。
我正在使用 Radzen 的 Blazor DialogService 并尝试遵循他们 documentation 中的模式 - 像这样将方法附加到它
protected override void OnInitialized()
{
DialogService.OnOpen += Open;
DialogService.OnClose -= Close;
DialogService.OnClose += Close;
}
private void Open(string Title, Type type, Dictionary<string, object> parameters, DialogOptions options)
{
}
private void Close(dynamic result)
{
if (result == true)
{
JS.InvokeAsync<string>("DisableDialogSubmit", "nhDialogSubmit");
SendEmail();
}
}
async void Submit()
{
await SubmitModal();
DialogService.OnClose -= Close;
}
void OnInvalidSubmit()
{
}
async Task SubmitModal() => await DialogService.OpenAsync("Confirm Submission", (ds =>
@<div style="top: 25%">
<p Style="margin-bottom: 1rem">Submit Form?</p>
<div class="row">
<div class="col-md-12">
<RadzenButton id="nhDialogSubmit" Text="Submit" Disabled="false" Click="() => ds.Close(true)" Style="margin-bottom: 10px; width: 150px" />
<RadzenButton Text="Cancel" Click="() => ds.Close(false)" ButtonStyle="ButtonStyle.Secondary" Style="margin-bottom: 10px; width: 150px" />
</div>
</div>
</div>),
new DialogOptions() { Width = "350px", Top = "35%", Left = "25%" });
此代码复制粘贴在每个页面上,在 SendEmail() 中具有不同的逻辑我让它工作了一点,使用了那种笨拙的本地事件附加和分离,但它有副作用,我确定我一开始就完全错误地使用它。我希望按作用域注入服务能让我做到这一点;将它创建为瞬态完成我的实现吗?我很难找到正确的东西来搜索以管理单页应用程序中任何服务上的事件,因此非常感谢任何提示或指示!
您指向的文档使用 @implements IDisposable
和 Dispose()
,这更有意义。
我认为完整的事件处理应该像他们的一样,没有其他 +=
或 -=
其他地方:
@implements IDisposable
...
@code {
protected override void OnInitialized()
{
DialogService.OnOpen += Open;
DialogService.OnClose += Close;
}
public void Dispose()
{
// The DialogService is a singleton so it is advisable to unsubscribe.
DialogService.OnOpen -= Open;
DialogService.OnClose -= Close;
}
...
}
此外,您不应该需要 JS 并将 Submit() 方法设为 async Task
,而不是 async void
。
我对 Blazor 服务器非常陌生,一般都在试验网页,但无法弄清楚如何将事件处理程序正确附加到应根据当前页面触发不同操作的模态。我只是希望能够在提交时将页面信息作为电子邮件发送,但它最终会发送所有呈现的页面电子邮件,因为它认为每个事件都已触发。
我正在使用 Radzen 的 Blazor DialogService 并尝试遵循他们 documentation 中的模式 - 像这样将方法附加到它
protected override void OnInitialized()
{
DialogService.OnOpen += Open;
DialogService.OnClose -= Close;
DialogService.OnClose += Close;
}
private void Open(string Title, Type type, Dictionary<string, object> parameters, DialogOptions options)
{
}
private void Close(dynamic result)
{
if (result == true)
{
JS.InvokeAsync<string>("DisableDialogSubmit", "nhDialogSubmit");
SendEmail();
}
}
async void Submit()
{
await SubmitModal();
DialogService.OnClose -= Close;
}
void OnInvalidSubmit()
{
}
async Task SubmitModal() => await DialogService.OpenAsync("Confirm Submission", (ds =>
@<div style="top: 25%">
<p Style="margin-bottom: 1rem">Submit Form?</p>
<div class="row">
<div class="col-md-12">
<RadzenButton id="nhDialogSubmit" Text="Submit" Disabled="false" Click="() => ds.Close(true)" Style="margin-bottom: 10px; width: 150px" />
<RadzenButton Text="Cancel" Click="() => ds.Close(false)" ButtonStyle="ButtonStyle.Secondary" Style="margin-bottom: 10px; width: 150px" />
</div>
</div>
</div>),
new DialogOptions() { Width = "350px", Top = "35%", Left = "25%" });
此代码复制粘贴在每个页面上,在 SendEmail() 中具有不同的逻辑我让它工作了一点,使用了那种笨拙的本地事件附加和分离,但它有副作用,我确定我一开始就完全错误地使用它。我希望按作用域注入服务能让我做到这一点;将它创建为瞬态完成我的实现吗?我很难找到正确的东西来搜索以管理单页应用程序中任何服务上的事件,因此非常感谢任何提示或指示!
您指向的文档使用 @implements IDisposable
和 Dispose()
,这更有意义。
我认为完整的事件处理应该像他们的一样,没有其他 +=
或 -=
其他地方:
@implements IDisposable
...
@code {
protected override void OnInitialized()
{
DialogService.OnOpen += Open;
DialogService.OnClose += Close;
}
public void Dispose()
{
// The DialogService is a singleton so it is advisable to unsubscribe.
DialogService.OnOpen -= Open;
DialogService.OnClose -= Close;
}
...
}
此外,您不应该需要 JS 并将 Submit() 方法设为 async Task
,而不是 async void
。