【问题标题】:passing IEnumerable<T> to API method in Blazor WASM将 IEnumerable<T> 传递给 Blazor WASM 中的 API 方法
【发布时间】:2020-10-26 09:05:58
【问题描述】:

请问,如何在 Blazor WASM 项目中使用 Http.GetFromJsonAsync 传递 IEnumerable 参数? 这是我在 razor 组件中的代码:

IEnumerable<WAGPiattValidePerUtente> piattValidePerUtente;

dipendenti = await Http.GetFromJsonAsync<IEnumerable<WAGDipendentiAttivitaNGiorniPrec>>($"WAGDipendentiAttivitaNGiorniPrecService/ByDaySottrDataPiattaforme/{(short)7}/{dataRif.ToString("yyyyMMdd")}/{piattValidePerUtente}");

在我的 API 控制器中,代码是:

        [HttpGet("ByDaySottrDataPiattaforme/{giorniDaSottrarre}/{dataRif}/{piattaforme}")]
    public async Task<ActionResult<IEnumerable<WAGDipendentiAttivitaNGiorniPrec>>> GetWAGDipendentiPiattAttivitaNGiorniPrec(short giorniDaSottrarre, string dataRif, IEnumerable<WAGDipendentiAttivitaNGiorniPrec> piattaforme)
    {
      //call a store procedure...
    }

调用该方法时出现此错误: 加载资源失败:服务器响应状态为 415 () 不支持的媒体类型

有人可以帮帮我吗?

【问题讨论】:

    标签: parameters entity-framework-core asp.net-core-webapi blazor-webassembly


    【解决方案1】:

    如何在 Blazor WASM 项目中使用 Http.GetFromJsonAsync 传递 IEnumerable 参数?

    加载资源失败:服务器响应状态为 415 () Unsupported Media Type

    通常我们使用路由数据和查询字符串值来传递简单类型的数据。

    要实现通过路由数据将 IEnumerable 参数传递给操作方法的要求,您可以尝试实现和使用自定义模型绑定器,如下所示。

    public class MyModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }
    
            // ...
            // implement it based on your actual requirement
            // code logic here
            // ...
    
            var model = new List<WAGPiattValidePerUtente>();
    
            if (bindingContext.ValueProvider.GetValue("piattaforme").FirstOrDefault() != null)
            {
                model = JsonSerializer.Deserialize<List<WAGPiattValidePerUtente>>(bindingContext.ValueProvider.GetValue("piattaforme").FirstOrDefault());
            }
    
    
            bindingContext.Result = ModelBindingResult.Success(model);
            return Task.CompletedTask;
        }
    } 
    

    将其应用于动作参数

    [HttpGet("ByDaySottrDataPiattaforme/{giorniDaSottrarre}/{dataRif}/{piattaforme}")]
    public async Task<ActionResult<IEnumerable<WAGDipendentiAttivitaNGiorniPrec>>> GetWAGDipendentiPiattAttivitaNGiorniPrec(short giorniDaSottrarre, string dataRif,
        [ModelBinder(BinderType = typeof(MyModelBinder))]
    IEnumerable<WAGPiattValidePerUtente> piattaforme)
    {
        //call a store procedure...
    

    从客户端应用发出请求

    var piattValidePerUtente_data = Uri.EscapeDataString(JsonSerializer.Serialize(piattValidePerUtente));
    
    dipendenti = await Http.GetFromJsonAsync<IEnumerable<WAGDipendentiAttivitaNGiorniPrec>>($"WAGDipendentiAttivitaNGiorniPrecService/ByDaySottrDataPiattaforme/{(short)7}/{dataRif.ToString("yyyyMMdd")}/{piattValidePerUtente_data}");
    

    测试结果

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2022-01-27
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多