因此,我正在blazor中构建一个组件库,并添加对输入组件的支持,以便在验证中构建blazor。
@inherits WindyInputTextBase;
@if(!string.IsNullOrEmpty(Label))
{
<label for="@Id" class="block text-sm font-medium">@Label</label>
}
<input class="mt-3 p-2 focus:outline-none focus:ring focus:ring-primary-light focus:border-primary block w-full shadow-sm sm:text-sm border border-gray-300 rounded-md @CssClass" id="@Id" name="@Id" @bind="@CurrentValue" />
<!--Div is empty when validation is not done.-->
<div class="text-danger text-sm mb-3">
<ValidationMessage For="@ValidationFor" />
</div>
输入组件的基类:
public class WindyInputTextBase : WindyInputBase<string>
{
protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out string result, [NotNullWhen(false)] out string? validationErrorMessage)
{
result = value is null ? string.Empty : value;
validationErrorMessage = null;
return true;
}
}
这个的基类:
public abstract class WindyInputBase<T> : InputBase<T>
{
[Parameter]
public string? Label { get; set; }
[Parameter]
public Expression<Func<T>>? ValidationFor { get; set; }
}
该组件(以及其他使用相同基础的组件(运行良好,但在EditForm组件之外使用它们时会出现此错误:
未处理的异常呈现组件:WindyUI。Form.EditForm.WindyInputText需要EditContext类型的级联参数。例如,您可以使用WindyUI。EditForm中的Form.EditForm.WindyInputText。系统InvalidOperationException:WindyUI。Form.EditForm.WindyInputText需要EditContext类型的级联参数。例如,您可以使用WindyUI。EditForm中的Form.EditForm.WindyInputText。
这很好,也是意料之中的事,但它迫使我编写两组Input组件,一组有验证,另一组没有。我知道MudBrazor做了我想做的事情,但我不知道他们到底是怎么做的,他们的源代码对我来说并不完全清楚,因为没有从InputBase继承的。
有没有一种方法可以创建一个具有blazor内置验证的组件,该组件可以在EditForm组件内部和外部使用?当然,这意味着当不使用EditForm中的组件时,没有内置验证是可以的。
谢谢,
当不需要验证时,不要在使用lambda的组件上设置lambda。然后在组件本身上创建一个null保护,该保护仅在验证lambda不为null时才呈现验证消息部分。这样,它可以在没有EditContext的情况下使用,但当然会缺少您所说的内置验证。