当我在输入字段中按 Enter 时,我想阻止服务器端 Blazor 触发 EditForm 的 OnSubmit 事件处理程序(由于其他一些原因我无法摆脱)。这似乎是一件容易的事,我就是无法解决。我编了一个我能想到的最小的例子:
_Index.razor:
@page "/"
@inject IJSRuntime JSRuntime;
<EditForm Model="Model" OnSubmit="HandleOnSubmit">
<input id="testInput"/>
<button type="submit" value="unneeded submit button"></button>
</EditForm>
@code
{
private CModel Model { get; set; } = new CModel() { ID = "ID", Name = "Name" };
private async Task HandleOnSubmit()
{
await JSRuntime.InvokeAsync<object>("alert", new object[] { "This alert shouldn't be shown!!" });
}
}
CModel 类(尽管它与问题无关):
public class CModel
{
public string ID { get; set; }
public string Name { get; set; }
}
和_Host.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PreventSubmitOnForm</title>
<base href="~/" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
</head>
<body>
<app>
<component type="typeof(App)" render-mode="ServerPrerendered" />
</app>
<div id="blazor-error-ui">
<environment include="Staging,Production">
An error has occurred. This application may no longer respond until reloaded.
</environment>
<environment include="Development">
An unhandled exception has occurred. See browser dev tools for details.
</environment>
<a href="" class="reload">Reload</a>
<a class="dismiss"></a>
</div>
<script src="_framework/blazor.server.js"></script>
<script>
document.getElementById("testInput").addEventListener('keypress', function (event) {
if (event.which === 13) {
event.preventDefault();
alert('Form submit prevented');
}
});
</script>
</body>
</html>
在 _Host.cshtml 中,我注册了一个新的事件处理程序keypress
,并且在我调试时,在页面创建时它会真正注册。但它永远不会在按键 Enter 时触发。而且我已经尝试过欺骗这种情况,@onkeypress:preventDefault
但是@onkeypress:stopPropagation
当我想仅针对我的输入字段和该特定字段仅针对事件:按下 Enter。
在普通的 HTML + JS 案例中,它就像一个魅力:https ://jsfiddle.net/wmk608gh/1/
所以我最终选择了 JS Interop 解决方案并添加了脚本
<script>
document.getElementById("testInput").addEventListener('keypress', function (event) {
if (event.which === 13) {
event.preventDefault();
alert('Form submit prevented');
}
});
</script>
到_Host.cshtml。但它似乎不起作用。我想我应该将我的脚本注册到另一个事件(而不是keypress
),或者也许我已经有一个最佳实践可以在这里遵循。
任何帮助表示赞赏。