基于 Blazor 大学教程和许多 SO/GitHub 帖子,我正在尝试创建一个继承自
InputBase<int?>
的自定义组件。
它显示正常,但在提交时,自定义验证方法
TryParseValueFromString()
不会触发,因此我的验证消息不会冒泡到编辑上下文中,也不会显示:
在方法体中设置断点进一步证明该方法永远不会触发,因为断点永远不会被命中。
随着时间的推移,这将进行复杂的验证,因此我不能依赖 DataAnnotations 验证来提供这些检查,并且希望更好地理解
TryParseValueFromString()
。
有人可以建议如何让上述方法触发不可解析的值吗?
@page "/"
@using BlazorAppTryParseValueFromString.Component
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@rendermode InteractiveServer
<PageTitle>Index</PageTitle>
<EditForm Model="myModel" OnValidSubmit="FormSubmit">
<ValidationSummary />
<p>
<IntegerComponent @bind-Value=myModel.MyNumber />
</p>
<p>
<input type="submit" value="Go" />
<ValidationMessage For="() => myModel.MyNumber" />
</p>
<p>
@Result
</p>
</EditForm>
@code {
public class MyModel
{
public int? MyNumber { get; set; }
}
public string Result { get; set; } = "";
public MyModel myModel { get; set; } = new();
public async void FormSubmit()
{
string yourNumber = myModel.MyNumber.HasValue ? myModel.MyNumber.Value.ToString() : "nothing";
Result = $"Your number was {yourNumber}";
}
}
@inherits InputBase<int?>
<div>
<input type="text" @bind=CurrentValue />
</div>
@code {
protected override bool TryParseValueFromString(string? value, out int? result, out string validationErrorMessage)
{
validationErrorMessage = "";
result = null;
if (string.IsNullOrWhiteSpace(value))
{
return true;
}
int parsedInt;
if (!int.TryParse(value.Trim(), out parsedInt))
{
validationErrorMessage = "Invalid value!";
return false;
}
result = parsedInt;
return true;
}
}
CurrentValue
而不是
CurrentValueAsString
。我假设因为用户总是输入一个字符串(无论它实际上看起来像什么),
TryParseValueFromString
然后会针对该字符串触发以验证并转换为所需的绑定值的类型。
<input type="text" @bind=CurrentValue />
应该是
<input type="text" @bind=CurrentValueAsString />
或者使用正确的 HTML5 输入进行更自动化的验证:
<input type="number" @bind=CurrentValueAsString />