【问题标题】:Blazor InputSelect Boolean issueBlazor InputSelect 布尔问题
【发布时间】:2021-03-06 11:21:36
【问题描述】:

我使用 InputSelect for boolean 时遇到了一个奇怪的问题,我使用 InputSelectNumber 类作为模板,我相信你已经看到它被共享(见下文):

public class InputSelectNumber<T> : InputSelect<T>
{
    protected override bool TryParseValueFromString(string value, out T result,
        out string validationErrorMessage)
    {
        if (typeof(T) == typeof(int))
        {
            if (int.TryParse(value, out var resultInt))
            {
                result = (T)(object)resultInt;
                validationErrorMessage = null;
                return true;
            }
            else
            {
                result = default;
                validationErrorMessage = "The chosen value is not a valid number.";
                return false;
            }
        }
        else
        {
            return base.TryParseValueFromString(value, out result, out validationErrorMessage);
        }
    }
}

在下面,经过一些调整,它可以与布尔值一起使用(它确实可以正常工作):

public class InputSelectBoolean<T> : InputSelect<T>
{
    protected override bool TryParseValueFromString(string value, out T result,
        out string validationErrorMessage)
    {
        if (typeof(T) == typeof(bool))
        {
            if(bool.TryParse(value, out var resultBool))
            {
                result = (T)(object)resultBool;
                validationErrorMessage = null;
                return true;
            }
            else
            {
                result = default;
                validationErrorMessage = "The chosen value is not a valid boolean.";
                return false;
            }
        }
        else
        {
            return base.TryParseValueFromString(value, out result, out validationErrorMessage);
        }
    }
}

那么在剃须刀页面上,实现是:

<EditForm Model="@isMyConverted">
    <InputSelectBoolean @bind-Value="@isMyConverted">
        <option value="true" selected>USD</option>
        <option value="false">XOM</option>
    </InputSelectBoolean>
</EditForm>
 
@code {
    public bool @isMyConverted = false;
}

它实际上工作得很好,它做出了它应该做的改变。但是,在选择器窗格中,默认情况下它始终为空,因此不会显示 USD 或 XOM。我必须选择一个值两次才能保持显示在窗格上。否则,它保持为空(即使对实际变量的更改完美发生)。

如果我将整个内容更改为 Int 输入,如下所示:

<EditForm Model="@isMyConverted">
    <InputSelectNumber @bind-Value="@isMyConverted">
        <option value="1" selected>USD</option>
        <option value="2">XOM</option>
    </InputSelectNumber>
</EditForm>

@code {
public int isMyConverted = 1;
}

一切正常,所选值按预期显示在选择器窗格中。任何帮助将不胜感激。

【问题讨论】:

    标签: blazor


    【解决方案1】:

    true 和 True 之间存在字符串不匹配。

    解决问题的方法有两种:

    1.更改选项值(以大写字母开头)

      <InputSelectBoolean @bind-Value="isMyConverted">
    
        <option value="True">true</option>
    
        <option value="False">false</option>
    
    </InputSelectBoolean>
    

    2。覆盖并调整 InputSelect 组件的 FormatValueAsString 方法。

       protected override string FormatValueAsString(bool value)
    
        {
    
            return value.ToString().ToLower();
    
        }
    

    【讨论】:

    • 非常感谢您!像魅力一样工作,作为一个懒惰的程序员,肯定会使用方法#1。 :)
    【解决方案2】:

    如果你只是想用你的 InputSelectBoolean 来解析布尔参数(就像上面提到的名字),我已经稍微优化了你的代码:

    public class InputSelectBoolean : InputSelect<bool>
    {
        protected override bool TryParseValueFromString(string? value, out bool result,
            out string validationErrorMessage)
        {
            if (bool.TryParse(value, out var resultBool))
            {
                result = resultBool;
                validationErrorMessage = string.Empty;
                return true;
            }
    
            result = default!;
            validationErrorMessage = "The chosen value is not a valid boolean.";
            return false;
        }
    }
    

    【讨论】:

    • deos 这仍然适用于 .NET 6?好像我的选择不再显示选项值了
    • 这样做反而以某种方式修复了它:Boolean.TryParse(value.ToString(), out var resultBool)
    猜你喜欢
    • 2021-06-22
    • 2020-10-30
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多