在 Blazor 中选择框绑定

Posted

技术标签:

【中文标题】在 Blazor 中选择框绑定【英文标题】:Select box binding in blazor 【发布时间】:2020-02-17 11:49:07 【问题描述】:

我正在尝试将模型中的 CountryId 绑定到 Blazor 中 SelectList 的选定项的值。所有 Country 项目都在一个类似 CountryId, CountryName 对象的列表中。我这样做的代码是这样的:

    <InputSelect @bind-Value="model.ByCountryId" class="form-control">
        @if (model?.Countries != null)
        
           @foreach (var cnt in model.Countries)
           
               <option value="@cnt.Id">@cnt.Name</option>
           
        
     </InputSelect>

还有代码块:

@code 

BrandModel model = new BrandModel();

protected override async Task OnInitializedAsync()

    model = new BrandModel
    
        Id = 19,
        ByCountryId = 1,
        Countries = new List<ent.Country>
            
                new ent.Country  Id = 1, Name = "Azerbaijan" ,
                new ent.Country  Id = 2, Name = "Turkey" 
            ,
        IsActive = true,
        Name = "Brand"
    ;

但是这个执行在浏览器中给了我这个错误:

blazor.webassembly.js:1 WASM: System.MissingMethodException: 找不到类型“System.ComponentModel.ByteConverter”的构造函数。

在 Blazor 中绑定 &lt;select&gt;model.data 的便捷方式是什么?

【问题讨论】:

【参考方案1】:

当我将&lt;InputSelect&gt; 放入&lt;EditForm Model="@model"&gt;..&lt;/EditForm &gt; 时效果很好,并且您的数据绑定没有问题。

尝试使用以下代码在 csproj 文件中设置 &lt;BlazorLinkOnBuild&gt;false&lt;/BlazorLinkOnBuild&gt;

<PropertyGroup>
   <BlazorLinkOnBuild>false</BlazorLinkOnBuild>
</PropertyGroup>

参考https://github.com/aspnet/AspNetCore/issues/7784

更新:

使用&lt;select&gt; 标签代替&lt;InputSelect&gt; 喜欢

<select @bind="model.ByCountryId">
        @if (model?.Countries != null)
        
            @foreach (var cnt in model.Countries)
            
                <option value="@cnt.Id">@cnt.Name</option>
            
        
</select>

【讨论】:

我按照你说的做了,但是得到了同样的未处理异常:(((。我认为问题在于绑定字节类型。因为错误描述是这样的:WASM: System.InvalidOperationException: Microsoft.AspNetCore.Components.Forms.InputSelect 1[System.Byte] does not support the type 'System.Byte' @Emba Ayyub 我看不出你在哪里使用字节......你的CountryBrandModel 的模型是什么样的?因为当我为 int 设置 ID 时效果很好 我的模特是这样的public class BrandModel public short Id get; set; [Required] public string Name get; set; [Required] public byte ByCountryId get; set; public bool IsActive get; set; public IEnumerable&lt;Country&gt; Countries get; set; @Emba Ayyub 我在 csproj 文件中使用&lt;select&gt; 及以上&lt;BlazorLinkOnBuild&gt;false&lt;/BlazorLinkOnBuild&gt; 标记删除了错误。查看我的更新。 @Emba Ayyub Great.Could you accept the answer如果你已经解决了问题【参考方案2】:

这是一个示例,说明如何在选择元素中显示国家/地区列表,并检索所选国家/地区代码或 ID。

<select class="form-control" @bind="@SelectedCountryID">

    <option value=""></option>
    @foreach(var country in CountryList)
    
        <option value = "@country.Code"> @country.Name </option >
    


</select>

<p>@SelectedCountryID</p>

代码块

@code 

    string selectedCountryID;

    string SelectedCountryID
    
        get => selectedCountryID;
        set
        
            selectedCountryID = value;

        
    

    List<Country> CountryList = new List<Country>()  new Country ("USA", "United States"),
                                                      new Country ("UK", "United Kingdom") ;

    public class Country
    

        public Country(string code, string name)
        
            Code = code;
            Name = name;
        
        public string Code  get; set; 
        public string Name  get; set; 

    


此代码适合与其他选择元素集成,形成级联下拉体验(选择国家后填充的城市列表等)。只需将代码 sn-p 复制到您的 Index.razor 文件并执行它...

【讨论】:

正如我所展示的,我做的完全一样,但得到了错误。不知道为什么? 你说你做的完全一样是什么意思?型号代表什么? model.Countries 代表什么?如果你想让我指出它有什么问题,请展示你的整个代码...... 我编辑了我的问题并在那里添加了所有代码。 您的 SelectedCountryID 是“”,您最初在哪里绑定?【参考方案3】:

&lt;InputSelect&gt; 在 .NET 5 中为我工作。对于每个输入(文本、数字、日期、选择、复选框等),我使用 &lt;EditForm&gt;Model

<EditForm Model="item">
   <InputSelect @bind-Value="item.CountryId">
      <option value=""></option>
      @foreach (var c in countries)
      
         <option value="@c.Id">@c.Name</option>
      
   </InputSelect>
</EditForm>

对于此示例:ItemModel item 至少具有属性 CountryIdList&lt;CountryModel&gt; countries 至少具有属性 int Idstring Name

【讨论】:

【参考方案4】:

在 Blazor 中使用 API 在 Core 6 中运行良好

<InputSelect @bind-Value="patientCreateDTO.DoctorId" class="form-control" id="doctorid">
    <option value="">--Select--</option>
    @foreach(var doctor in doctorslist)
    
        <option value="@doctor.Id">@doctor.Doctor_name</option>
    
</InputSelect>

这是代码

private List<DoctorReadDTO> doctorslist = new();

// ...

protected override async Task OnInitializedAsync()

    var response = await dService.GetDoctor();
    if (response.Success)
    
        doctorslist = response.Data;
    

【讨论】:

以上是关于在 Blazor 中选择框绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF / C# 中选择绑定项目后维护组合框文本

KnockoutJS selectedOptions 绑定导致选择框在 IE8 中抖动

在基于非绑定列重新查询后访问 VBA 还原列表框选择

组合框选择和模型绑定

根据组合框选择更改文本框值

如何从列表框绑定 Windows Phone 7 中选择一个项目