TryParseValueFromString 未触发 - 无验证消息输出

问题描述 投票:0回答:1

基于 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;
    }
}

更新

  1. 将 Blazor University 的 tutorial 文件添加到我的项目中,并且同样的方法也不会在那里触发。因此,这似乎是一个更广泛的问题。
  2. 在 VS2022 中创建了一个新的 Blazor Server 项目类型(本机 .Net8)并添加了相同的页面。出现同样的故障。
blazor blazor-server-side .net-8.0
1个回答
0
投票
我错误地绑定到了

CurrentValue

 而不是 
CurrentValueAsString
。我假设因为用户
总是输入一个字符串(无论它实际上看起来像什么),TryParseValueFromString
然后会针对该字符串触发以验证并转换为所需的绑定值的类型。

<input type="text" @bind=CurrentValue />
应该是

<input type="text" @bind=CurrentValueAsString />
或者使用正确的 HTML5 输入进行更自动化的验证:

<input type="number" @bind=CurrentValueAsString />
    
© www.soinside.com 2019 - 2024. All rights reserved.