【发布时间】:2021-06-29 22:09:24
【问题描述】:
我正在开发一个 Blazor 服务器应用程序,该应用程序通过几个步骤收集用户信息。父页面创建一个模型(我们称之为 MainModel),它是子组件中使用的模型的数据集合,父将此模型作为级联参数传递给子,子收集更多信息并填写该模型中的匹配参数。
当组件被加载时,它会加载自己的模型。修改输入时,如果通过验证,我需要检查 ChildModel 并将其添加到 MainModel。根据 Blazor 文档,我将 FieldChanged 事件用于 EditContext。
<EditForm EditContext="editContext">
<DataAnnotationsValidator/>
<div class="col-md-6">
<label for="FirstName" class="form-label">First Name</label>
<InputText type="text" @bind-Value="Model.FirstName" class="form-control"
name="FirstName"/>
<ValidationMessage For="@(() => Model.FirstName)" />
</div>
<div class="col-md-3">
<label for="LastName" class="form-label">Last Name</label>
<InputText type="text" @bind-Value="Model.LastName" class="form-control"
name="LastName"/>
<ValidationMessage For="@(() => Model.LastName)" />
</div>
<div class="col-md-3">
<label for="Age" class="form-label">Age</label>
<InputText type="text" @bind-Value="Model.Age" class="form-control" name="Age"/>
<ValidationMessage For="@(() => Model.Age)" />
</div>
</EditForm>
@code{
[CascadingParameter]
public MainModel MainModel { get; set; }
private ChildModel Model {get; set; }
private EditContext editContext;
protected override async Task OnInitializedAsync()
{
editContext = new EditContext(Model);
editContext.OnFieldChanged += EditContext_OnFieldChanged;
base.OnInitialized();
}
private async void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
{
if(editContext.Validate()) //<-- this shows validation messages
{
//copy child model to main model here
}
}
}
问题是,一旦修改了字段,就会按预期触发此事件,并且验证模型会触发所有输入的验证消息,因为此时没有填写其他必填字段.
有没有办法在不触发验证消息的情况下验证模型?
也许我需要对 ValidationMessageStore 做一些事情,但我还没有弄清楚。我可以通过查看输入同级的已修改和无效类来切换单个验证消息,但我确信 Blazor 对此有解决方案。
到目前为止我还没有答案,所以我目前的实现是这样的:
当调用 EditContext.Validate() 时,我最初使用 css 隐藏消息,并且仅在输入被修改且无效时才显示它们:
.validation-message {
display: none;
}
input.modified.invalid {
border: 1px solid red;
position: relative;
}
input.modified.invalid + .validation-message {
position: absolute;
margin-top: -10px;
color: red;
background: #fdf2f2;
border: 1px solid #ffdede;
padding: 5px;
display: block;
z-index: 1;
}
【问题讨论】:
-
看看 Fluentvalidator for .net blazor 我相信有一个可行的。
-
@EricKing 很有帮助,但不是我想要的。我不想验证单个字段,我想知道当任何输入发生更改而不显示所有输入的验证消息时整个模型是否有效。这背后的原因是因为我有一个下一步按钮,一旦模型有效就会显示。
-
酷。想我会分享,以防它激发一些见解。
-
@EricKing 我很感激。
标签: c# validation blazor blazor-server-side