【问题标题】:Blazor: How to Use a Select Option Razor Component for Multiple Enum Classes?Blazor:如何为多个枚举类使用选择选项 Razor 组件?
【发布时间】:2021-09-21 07:16:53
【问题描述】:

我有一个选择选项组件,它绑定和填充特定枚举类的值。但是,我也希望相同的组件也可以用于另一个枚举类。我尝试修改组件并使用typeofdynamic,但它不起作用。如何为多个枚举类重复使用相同的选择选项组件?

在我的页面中调用组件:

<SelectEnumComponent @bind-EnumProperty="@driver.DriverType"
                            EnumType="@(typeof(DriverType))"/>

选择选项组件:

// SelectEnumComponent.razor

    <div class="form-group">
        <select class="form-control" 
                value="@EnumProperty"
                @onchange="OnValueChanged">
            @foreach (var type in Enum.GetValues(EnumType))
            {
                <option value="@type">@type</option>
            }
        </select>
    </div>
    
        @code {
    
            [Parameter]
            public dynamic EnumProperty { get; set; }
    
            [Parameter]
            public EventCallback<dynamic> EnumPropertyChanged { get; set; }
    
            [Parameter]
            public Type EnumType { get; set; }
    
            private Task OnValueChanged(ChangeEventArgs e)
            {
                EnumProperty = Enum.Parse(EnumType, e.Value.ToString(), true); // case insensitive
                return EnumPropertyChanged.InvokeAsync(EnumProperty);
            }
        }

枚举类 - PropertyType:

public enum PropertyType
    {
        [Display(Name = "String")]
        String,
        [Display(Name = "Numeric")]
        Numeric,
        [Display(Name = "Double")]
        Double,
        [Display(Name = "Enumeration")]
        Enumeration,
        [Display(Name = "Boolean")]
        Boolean
    }

枚举类 - DriverType:

public enum DriverType
    {
        [Display(Name = "WEB API")]
        API,
        [Display(Name = "Device")]
        Device,
        [Display(Name = "SSD")]
        SSD
    }

错误:

error CS1503: Argument 2: cannot convert from 'Microsoft.AspNetCore.Components.EventCallback<SharedModels.DriverType>' to 'Microsoft.AspNetCore.Components.EventCallback'

【问题讨论】:

  • Visual Studio 中有关 EventCallback 的这些错误消息非常错误。你的代码没有编译运行吗?
  • 是的,代码没有编译运行。

标签: c# asp.net asp.net-core razor blazor


【解决方案1】:

我用两个枚举进行测试,它可以工作。我在演示中使用EnumProperty 而不是@bind-EnumProperty,我正在使用.net 5:

剃须刀:

      <SelectEnumComponent EnumProperty="@driver.DriverType" EnumType="@(typeof(DriverType))" />
        <SelectEnumComponent EnumProperty="@driver.PropertyType" EnumType="@(typeof(PropertyType))" />
@code {
    [Parameter]
    public Driver driver { get; set; } = new Driver();

}

司机:

public class Driver
    {
        public DriverType DriverType { get;set; }
        public PropertyType PropertyType { get; set; }

    }

结果:

【讨论】:

  • 我使用 EnumProperty 而不是 @bind-EnumProperty 如你所说,但我没有在父页面上获得更改的值。我有一个Driver 列表,我使用foreach 对其进行迭代,我为每个DriverType 属性使用选择组件。你觉得不更新的原因是什么?当我将组件代码重置为仅使用一个枚举时,绑定有效,并且我在父页面上获得了更改的值。可能是组件中的EventCallback 不起作用,因此如果不使用@bind-EnumProperty,则不会将值更新到父页面?
  • 你的项目是什么版本的?你的意思是如果你在代码中使用dynamic和typeof,你总是会得到cannot convert from 'Microsoft.AspNetCore.Components.EventCallback&lt;SharedModels.DriverType&gt;' to 'Microsoft.AspNetCore.Components.EventCallback'
  • 我正在为我的项目使用 .NET 5。是的,我试图克服这个错误,但我无法做到。您是否尝试过使用列表并查看更改选择选项时列表中的值是否更新?
  • 如果我重置我的选择组件代码以仅使用一个枚举类,我可以在更改文本输入或选择选项时更新我的​​列表:@foreach (var driver in Drivers.Select((value, i) =&gt; new { i, value })) { &lt;InputComponent @bind-Data="@driver.value.DriverName"/&gt; &lt;SelectEnumComponent @bind-EnumProperty="@driver.value.DriverType"/&gt; }。我想我将为每个枚举类创建一个选择选项组件,以确保选项的更新正常
  • 你可以看到我的图片,select更改后会刷新foreach。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多