为避免命名冲突,将InputText改名为InputString,其实内部类型就是string。
<div class="d-flex">
<label class="control-label w-auto mt-2"><b>@Lable</b></label>
<div style="width:@InputWidth">
<input type="text" @bind-value="Value" class="form-control" @onblur="ValueChangedHandle" disabled="@Disabled" />
@if (ErryFor)
{
<span class="w-100">@ChildContent</span>
}
</div>
</div>
@code {
[Parameter]
public required string Lable { get; set; }
[Parameter]
public string? Value { get; set; }
[Parameter]
public string InputWidth { get; set; } = "300";
[Parameter]
public EventCallback<string?> ValueChanged { get; set; }
[Parameter]
public bool Disabled { get; set; }
[Parameter]
public RenderFragment? ChildContent { get; set; }
[Parameter]
public bool ErryFor { get; set; }
private async void ValueChangedHandle(FocusEventArgs e)
{
await ValueChanged.InvokeAsync(Value);
}
protected override void OnParametersSet()
{
Lable += ":";
InputWidth += "px;";
}
}
注意,组件的总长不能大于上一级容器长度,否则标签会分行或断行。设置为焦点离开触发变更事件,没有触发验证事件。
使用:
<InputString Lable="单位名称" @bind-Value="model.CompanyName" InputWidth="500" ErryFor="true">
<ValidationMessage For="()=>model.CompanyName" />
</InputString>
可能有人会说用反射获取标签,我认为上面这个代码非常明显地显示了这是哪个属性输入框,用反射反而查找起来不容易。
效果: