【问题标题】:Using InputRadio with bool values使用带布尔值的 InputRadio
【发布时间】:2021-04-08 13:52:25
【问题描述】:

我有一个InputRadio 控件,如下所示:

<InputRadioGroup Name="FooBar" @bind-Value="Foo.Bar">
    <InputRadio Name="FooBar" Value=1 />Yes<br>
    <InputRadio Name="FooBar" Value=0 />No<br>
</InputRadioGroup>

Foo.Bar 当前是可以为空的int,因为看起来int 是内置InputRadio 控件绑定所期望的。我宁愿将Foo.Bar 设置为可空的bool 而不是int,因为我的应用程序有很多是/否问题,并且在代码中使用真/假会使事情变得更容易和更易读。

Blazor 中是否有办法对其进行配置,以便 InputRadio 控件可以绑定到布尔值?

【问题讨论】:

    标签: blazor blazor-server-side blazor-client-side


    【解决方案1】:

    首先,获取布尔值通常是一个复选框,因此您可以先尝试一下。

    <EditForm Model="@Foo">
    
        Type: @Foo.Bar.GetType()
        <br />
        Value: @Foo.Bar
        <br /><br />
    
        <InputCheckbox @bind-Value="@Foo.Bar">I understand</InputCheckbox>
    
    </EditForm>
    
    @code{
        MyClass Foo { get; set; } = new MyClass();
    
        public class MyClass
        {
            public bool Bar { get; set; } = true;
        }
    }
    

    如果您必须使用单选按钮,请继续阅读。

    我认为理想情况下,这应该与真正的 bool 值一起使用,但它似乎没有,这是一个 repro(也许你可以在他们的 repo 中使用 MS 记录它) - 最初它似乎可以解析,但是更改值会引发它无法从字符串中解析。这向我表明他们只支持单选按钮组的stringint

    <EditForm Model="@Foo">
    
        Type: @Foo.Bar.GetType()
        <br />
        Value: @Foo.Bar
        <br /><br />
    
        <InputRadioGroup Name="FooBar" @bind-Value="@Foo.Bar">
            <InputRadio Name="FooBar" Value="@true" />Yes<br>
            <InputRadio Name="FooBar" Value="@false" />No<br>
        </InputRadioGroup>
    
    </EditForm>
    
    @code{
        MyClass Foo { get; set; } = new MyClass();
    
        public class MyClass
        {
            public bool Bar { get; set; } = true;
        }
    }
    

    解决方案:

    • 尽可能使用枚举(它基本上是一个整数,这就是它起作用的原因)
    • 使用可解析为所需布尔值的辅助字段(示例如下)

    要使辅助字段起作用,您需要可以解析的字符串,并且可能需要将它们作为视图模型中的变量,因为仅设置 Value="@true"Value="true" 实际上会尝试查找字段,或使用布尔值,而 HTML 元素作为字符串匹配。语法有一点点 22。

    <EditForm Model="@Foo">
    
        Type: @Foo.Bar.GetType()
        <br />
        Value: @Foo.Bar
        <br />
        String Value @Foo.BarString
        <br /><br />
    
        <InputRadioGroup Name="FooBar" @bind-Value="@Foo.BarString">
            <InputRadio Name="FooBar" Value="@trueVal" />Yes<br>
            <InputRadio Name="FooBar" Value="@falseVal" />No<br>
        </InputRadioGroup>
    
    </EditForm>
    
    @code{
        string trueVal = "true";
        string falseVal = "false";
        MyClass Foo { get; set; } = new MyClass();
    
        public class MyClass
        {
            public string BarString { get; set; } = "true";
            public bool Bar { get { return bool.Parse(BarString); } set { BarString = value.ToString().ToLowerInvariant(); } }
        }
    }
    

    【讨论】:

    • 在我的情况下需要单选按钮,因为用户 需要 进行选择(是或否)并且需要输入。我认为使用枚举是目前最好的解决方案。我正在尝试关注docsInputRadio,但使用示例时保存的数据类型有一个字符串。仍在努力解决这个问题。感谢您的详细回答。
    • 我认为单选按钮只支持字符串和整数(因此,枚举)
    • 是的。我现在使用枚举(例如here),但保存到数据库的值是一个字符串,“是”。我希望它是一个 int(0 或 1)
    • 不过,这有其优势。我认为这取决于数据库层来决定是否使用 .ToString
    • 在浪费了几个小时后,我可以确认我无法让 bool 工作。消息是“无法将 'System.String' 类型的对象转换为 'System.Boolean' 类型。”
    【解决方案2】:

    这适用于 .NET 6:

    <InputRadioGroup Name="FooBar" @bind-Value="@Foo.Bar">
        <InputRadio Name="FooBar" Value="@true" />Yes<br>
        <InputRadio Name="FooBar" Value="@false" />No<br>
    </InputRadioGroup>
    

    【讨论】:

      【解决方案3】:

      这个问题已经得到解答,但也许有些人喜欢我提出的解决方案。

      形成一个InputRadioGroup 我希望你可以像这样简单地绑定它

      <InputRadioGroup Name="FooBar" @bind-Value="@Foo.Bar">
          <InputRadio Name="FooBar" Value="@true" />Yes<br>
          <InputRadio Name="FooBar" Value="@false" />No<br>
      </InputRadioGroup>
      

      @Foo.Bar 是真还是假,但这不起作用。 使用InputCheckbox 和反转值可以解决此问题。

      在你的页面写

      <InputCheckbox @bind-Value="Foo.Bar" type="checkbox" /> Text 1
      <InputCheckbox @bind-Value="Foo.ReversedBar" type="checkbox" /> Text 2
      

      并在您的Foo 模型中写入

          public bool Bar
          {
              get => _bar;
              set
              {
                  _bar = value;
                  _reversedBar = !value;
              }
          }
          private bool _bar;
      
          public bool ReversedBar
          {
              get => _reversedBar;
              set
              {
                  _reversedBar = value;
                  _bar = !value;
              }
          }
          private bool _reversedBar;
      

      然后您可以简单地将 Foo.Bar 值存储在您的数据库中,或者用它做任何您想做的事情。

      如果您希望其中一个值在页面加载时已经为真,那么您可以这样做。

      protected override void OnInitialized()
      {
          Foo.Bar = true;
      }
      

      如果您希望InputCheckbox 是圆形的,您可以使用一些css

      【讨论】:

        猜你喜欢
        • 2020-03-16
        • 2021-02-26
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多