我EditForm在 Blazor 服務器中使用。EditForm有一個名為 的屬性OnValidSubmit。
假設我Required在模型中的一個欄位上使用了屬性,例如:
[Required]
public string Name { get; set; }
如果用戶在瀏覽器中禁用 JavaScript,服務器端驗證是否也由OnValidSubmit?
在ModelState.IsValidasp.netmvc中有,在 Blazor 中有替代方案嗎?考慮到使用OnValidSubmit,真的有必要在服務器端再次手動檢查模型驗證嗎?
uj5u.com熱心網友回復:
如果用戶在瀏覽器中禁用 JavaScript,服務器端驗證是否也由 OnValidSubmit 執行?
是的,只要沒有OnSubmit處理程式在EditForm. 這是來自的相關代碼EditForm
private async Task HandleSubmitAsync()
{
Debug.Assert(_editContext != null);
if (OnSubmit.HasDelegate)
{
// When using OnSubmit, the developer takes control of the validation lifecycle
await OnSubmit.InvokeAsync(_editContext);
}
else
{
// Otherwise, the system implicitly runs validation on form submission
var isValid = _editContext.Validate(); // This will likely become ValidateAsync later
if (isValid && OnValidSubmit.HasDelegate)
{
await OnValidSubmit.InvokeAsync(_editContext);
}
if (!isValid && OnInvalidSubmit.HasDelegate)
{
await OnInvalidSubmit.InvokeAsync(_editContext);
}
}
}
在 Blazor Server 中,一切都發生在服務器上的 Hub Session 中。在 WASM 中,這一切都發生在瀏覽器中運行的 WASM 代碼中。
EditForm有一個它級聯的EditContext實體(直接傳遞給它或從中創建)。Model
Editcontext有一個ValidationMessageStore維護有效訊息串列的。
EditContext有一個Validate引發OnValidationRequested事件的方法。它本身不做任何驗證。
任何具有注冊處理程式的驗證器都會被呼叫,運行它們的驗證程序并將任何訊息記錄到中央訊息存盤中。
在下面的代碼中(取自 MS-Docs)DataAnnotationsValidator捕獲級聯EditContext并EditForm注冊一個處理程式。當被觸發時,它會處理模型屬性并將所有驗證訊息記錄到訊息存盤中。
<EditForm Model="@starship" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
消費者組件,例如從訊息存盤中ValidationSummary捕獲級聯和讀取訊息。EditContext
輸入控制元件做同樣的事情來根據欄位的狀態切換它們的 css。
所有這些消費者都使用For引數中提供的運算式來查找指定給For運算式中提供的欄位的訊息。
uj5u.com熱心網友回復:
如果用戶在瀏覽器中禁用 JavaScript,服務器端驗證是否也由 OnValidSubmit 執行?
涅特
實際上,您的 Blazor Server App 根本不會加載(這需要檢查,但我幾乎可以肯定)
在 asp.net mvc 中有 ModelState.IsValid,在 Blazor 中有替代方案嗎?
還沒有,還沒有……
考慮到OnValidSubmit的使用,真的有必要在服務器端再次手動檢查模型驗證嗎?
是的當然...
The checks that you do on the Client side are purely for your front-end workflow/validation. You must always check the data that you get on your serverside no matter what. Relying on front-end check where every client could behave as it wishes (per your example, disable Javascript, or tweaking with the data sent over to your server-side piece) is not sufficient.
于連
uj5u.com熱心網友回復:
您可以自己觸發驗證。這在 Blazor Server 中是這樣作業的:
<EditForm Model="YourModel" @ref="_form">
@* Your Form here *@
</EditForm>
<button type="button" class="btn btn-primary" @onclick="SubmitAsync">Submit</button>
@code {
private EditForm? _form;
private Task SubmitAsync()
{
if(_form is null || _form.EditContext is null)
{
return Task.CompletedTask;
}
if (_form.EditContext.Validate())
{
// Do your stuff here.
}
}
}
但是請記住,使用這種方法不再可能通過按 Enter 鍵來提交表單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533804.html
