Blazor 自定义组件没有';t验证未成功时返回值

Blazor 自定义组件没有';t验证未成功时返回值,blazor,Blazor,我正在Blazor中创建一个简单的自定义货币组件。我从InputBase继承并实现bool-TryParseValueFromString(字符串值、out-TValue结果、out-string-validationErrorMessage) 问题是,我想在TryParseValueFromString未成功时返回值 父组件 <div class="form-group mb-3"> <label for="MyInpu

我正在Blazor中创建一个简单的自定义货币组件。我从
InputBase
继承并实现
bool-TryParseValueFromString(字符串值、out-TValue结果、out-string-validationErrorMessage)

问题是,我想在
TryParseValueFromString
未成功时返回值

父组件

 <div class="form-group mb-3">
            <label for="MyInputTextArea">Input currency</label>
            <InputCurrency @bind-Value=FormData.SomeStringCurrency id="MyInputTextArea" class="form-control"/>
            <ValidationMessage For="() => FormData.SomeStringCurrency"></ValidationMessage>
        </div>
@using System.Globalization
@inherits InputBase<string>

<input type="string" @attributes=AdditionalAttributes class=@CssClass @bind=CurrentValueAsString />

@code{
private CultureInfo _culture = CultureInfo.CreateSpecificCulture("de");

protected override string FormatValueAsString(string value)
{
    if (string.IsNullOrWhiteSpace(value))
    {
        return string.Empty;
    }

    if (Decimal.TryParse(value, NumberStyles.Currency, _culture, out decimal result))
    {
        return Convert.ToDecimal(value).ToString("N", _culture);
    }
    else
    {
        return value;
    }
}

protected override bool TryParseValueFromString(string value, out string result, out string validationErrorMessage)
{
    try
    {
        var decimalValue = ReturnDecimalIfSuccessFul(value);

        result = decimalValue.ToString();
        validationErrorMessage = null;
        return true;
    }
    catch
    {
        validationErrorMessage = "Not a valid currency value.";
        result = value; // here i am assigning the value but it's not returned 
        return false;
    }
}

private decimal? ReturnDecimalIfSuccessFul(string value)
{
    if (string.IsNullOrWhiteSpace(value))
    {
        return null;
    }

    var result = Decimal.Parse(value, NumberStyles.Currency, _culture);
    
    return result;
}

输入货币
自定义组件

 <div class="form-group mb-3">
            <label for="MyInputTextArea">Input currency</label>
            <InputCurrency @bind-Value=FormData.SomeStringCurrency id="MyInputTextArea" class="form-control"/>
            <ValidationMessage For="() => FormData.SomeStringCurrency"></ValidationMessage>
        </div>
@using System.Globalization
@inherits InputBase<string>

<input type="string" @attributes=AdditionalAttributes class=@CssClass @bind=CurrentValueAsString />

@code{
private CultureInfo _culture = CultureInfo.CreateSpecificCulture("de");

protected override string FormatValueAsString(string value)
{
    if (string.IsNullOrWhiteSpace(value))
    {
        return string.Empty;
    }

    if (Decimal.TryParse(value, NumberStyles.Currency, _culture, out decimal result))
    {
        return Convert.ToDecimal(value).ToString("N", _culture);
    }
    else
    {
        return value;
    }
}

protected override bool TryParseValueFromString(string value, out string result, out string validationErrorMessage)
{
    try
    {
        var decimalValue = ReturnDecimalIfSuccessFul(value);

        result = decimalValue.ToString();
        validationErrorMessage = null;
        return true;
    }
    catch
    {
        validationErrorMessage = "Not a valid currency value.";
        result = value; // here i am assigning the value but it's not returned 
        return false;
    }
}

private decimal? ReturnDecimalIfSuccessFul(string value)
{
    if (string.IsNullOrWhiteSpace(value))
    {
        return null;
    }

    var result = Decimal.Parse(value, NumberStyles.Currency, _culture);
    
    return result;
}
@使用系统全球化
@继承InputBase
@代码{
私有文化信息_culture=CultureInfo.CreateSpecificCulture(“de”);
受保护的重写字符串FormatValueAsString(字符串值)
{
if(string.IsNullOrWhiteSpace(value))
{
返回字符串。空;
}
if(Decimal.TryParse(值、NumberStyles.Currency、_区域性、输出十进制结果))
{
返回Convert.ToDecimal(value).ToString(“N”,_区域性);
}
其他的
{
返回值;
}
}
受保护的重写bool TryParseValueFromString(字符串值、输出字符串结果、输出字符串验证错误消息)
{
尝试
{
var decimalValue=返回DecimalifSuccessful(值);
结果=小数点值。ToString();
validationErrorMessage=null;
返回true;
}
抓住
{
validationErrorMessage=“不是有效的货币值。”;
result=value;//我在这里赋值,但没有返回
返回false;
}
}
私有十进制?返回十进制成功(字符串值)
{
if(string.IsNullOrWhiteSpace(value))
{
返回null;
}
var result=Decimal.Parse(值、numberstyle.Currency、_区域性);
返回结果;
}

如果未成功解析该值,则不会向用户显示。仅显示最后一个成功解析的值,但我希望用户始终将该值输入到输入中…

复制运行和测试

InputCurrency.razor
@使用系统全球化
@继承InputBase
@代码{
私有文化信息_culture=CultureInfo.CreateSpecificCulture(“de”);
受保护的异步任务OnInputValueChanged(ChangeEventArgs e)
{
CurrentValueAsString=e.Value.ToString();
等待任务。完成任务;
}
受保护的重写字符串FormatValueAsString(字符串值)
{
if(string.IsNullOrWhiteSpace(value))
{
返回字符串。空;
}
if(Decimal.TryParse(值、NumberStyles.Currency、_区域性、输出十进制结果))
{
返回Convert.ToDecimal(value).ToString(“N”,_区域性);
}
其他的
{
返回值;
}
}
受保护的重写bool TryParseValueFromString(字符串值、输出字符串结果、输出字符串验证错误消息)
{
尝试
{
var decimalValue=返回DecimalifSuccessful(值);
结果=小数点值。ToString();
validationErrorMessage=null;
返回true;
}
抓住
{
validationErrorMessage=“不是有效的货币值。”;
result=value;//我在这里赋值,但没有返回
返回false;
}
}
私有十进制?返回十进制成功(字符串值)
{
if(string.IsNullOrWhiteSpace(value))
{
返回null;
}
var result=Decimal.Parse(值、numberstyle.Currency、_区域性);
返回结果;
}
}
剃刀索引
@page/“
姓名:
输入货币

拯救

@代码 { 私有编辑上下文编辑上下文; 私人产品=新产品(); 受保护的覆盖无效OnInitialized() { EditContext=新的EditContext(产品); base.OnInitialized(); } 公共异步任务HandleValidSubmit() { 等待任务。运行(()=> { Console.WriteLine(“保存…”); }); } 公共类产品 { 公共字符串名称{get;set;} 公共字符串Price{get;set;} } }
是的,基本上解决了我的问题。我不知道不需要调用FormatValueAsString,谢谢!