【发布时间】:2021-02-11 10:22:07
【问题描述】:
如果嵌套组件未正确填写,我需要显示验证消息。该组件被其他父组件使用,他们需要获得有关是否存在验证问题的反馈。
我已经为嵌套组件尝试了以下代码并使用了CanSubmit 方法。虽然该方法可以正确判断是否存在验证问题,但验证消息并未显示。
以下所有代码都可以在 blzorrepl 上进行测试: https://blazorrepl.com/repl/GvOQlvvv1789ra1G37
@if(editContext != null) {
<EditForm EditContext="@editContext">
<input type="text" @bind="testModel.Name" />
<DataAnnotationsValidator />
<ValidationSummary />
</EditForm>
}
@code {
[Parameter]
public TestModel testModel
{
get { return (TestModel)editContext?.Model; }
set { editContext = new EditContext(value); }
}
EditContext editContext;
public bool CanSubmit()
{
return editContext.Validate();
}
}
这是我的父组件代码,有点减少但重现了问题:
<ChildComponent @ref="myTestComponent" testModel="testModel" />
<input type="button" @onclick="buttonClick" value="validate programmatically" />
<div>@testMessage</div>
@code {
TestModel testModel = new TestModel();
ChildComponent myTestComponent;
string testMessage;
void buttonClick()
{
testMessage = "not passed validation";
if (myTestComponent.CanSubmit())
{
testMessage = "passed validation!";
}
}
}
testMessage 仅用于显示验证状态。
如何使父组件导致嵌套组件显示验证消息?我只能将submit 放在父组件中。
根据要求,这里有一个更完整的示例来说明我正在做的事情,一个可以编辑的项目列表内联,以及一个用于添加更多实例的表单。 https://blazorrepl.com/repl/mlYwlQPm34bekYE824
【问题讨论】:
-
您将需要一个自定义验证器。 EditForm 仅适用于 InputCheckBox、InputDate 等内置表单组件。您可以查看 Micorsoft 文档
-
@JoeGER94 如果我在
submit中输入并单击submit,我可以显示验证消息。我不明白为什么我应该使用内置组件——它们如何让验证消息在这种情况下开始显示? -
您使用
<input>而不是<InputText>有什么原因吗?从InputBase继承的组件具有许多内置功能,例如验证。如果您将其更改为<InputText @bind-Value="testModel.Name" />,它应该可以工作。请记住,必须在ValidationSummary显示某些内容之前修改该字段。因此,添加文本、删除文本、关注其他内容应该会触发验证。 -
@Justthebenno 我希望在运行
CanSubmit方法时显示错误消息。将input更新为InputText在模糊事件中显示验证消息,但是当我按下提交按钮时,该消息再次被隐藏。 -
我想知道您为什么决定使用这种方法?您不知道
InputText组件还是您选择的根本原因?这将导致下一个问题:一旦设置了testModel的参数,您为什么决定创建EditContext?如果单击父组件中的按钮,它将触发渲染周期。在此循环期间,将(再次)设置参数。所以每次,EditContext及其验证状态都会被重置。