如何在 Blazor 中使用 Http.GetFromJsonAsync 将模型对象传递给控制器​​函数

How to pass model object to the controller function using Http.GetFromJsonAsync in Blazor

我想使用 Http.GetFromJsonAsync

将完整的模型对象传递给控制器​​函数

我的模型搜索过滤器从前端获取值:

    public Models.SearchFilter SearchFilter { get; set; } = new Models.SearchFilter();
  private List<Models.UtpResult> lst_Company;

我使用了下面的代码,但它不起作用。错误消息是无法将模型类型转换为 System.text.JsonJsonserializer:

lst_Company = await Http.GetFromJsonAsync<List<Models.Result >>("api/Services/SearchCompany", SearchFilter );

控制器函数是:

  [HttpGet("company/search")]
        public Models.Result SearchCompany([FromBody] Models.SearchFilter filter)
        {
            return _iTRepository.SearchCompany(filter);
        }

预期的 return 类型 List<Models.SearchFilter> 与控制器的 return 类型不匹配:Models.Result.

另外,GetFromJsonAsync 中的第二个参数是错误的。您不能使用 GET 那样传递模型。您必须将其转换为 url 的一部分,或者为此使用 POST

这是我用来检索分页列表的 API 服务的通用方法。它演示了如何使用 PostAsJsonAsync 以及如何检索结果。您可以用同样的方式传递 SearchFilter。

public override async ValueTask<List<TRecord>> SelectPagedRecordsAsync<TRecord>(RecordPagingData pagingData)
{
  var response = await this.HttpClient.PostAsJsonAsync($"/api/{GetRecordName<TRecord>()}/listpaged", pagingData);
  return await response.Content.ReadFromJsonAsync<List<TRecord>>();
}

和处理它的服务器控制器:

[MVC.Route("/api/weatherforecast/listpaged")]
[HttpPost]
public async Task<List<WeatherForecast>> Read([FromBody] RecordPagingData data) => await DataService.SelectPagedRecordsAsync<WeatherForecast>(data);

加法

你的电话看起来像这样:

var response = await this.HttpClient.PostAsJsonAsync($"api/Services/SearchCompany", SearchFilter );
lst_Company = await response.Content.ReadFromJsonAsync<List<Models.UtpResult>>();

和控制器

[HttpPost("company/search")]
public async Task<List<Models.UtpResult>> SearchCompany([FromBody] Models.SearchFilter filter) 
{
// I assume this is async?
return await _iTRepository.SearchCompany(filter);

// else miss out the async and

return Task.FromResult(_iTRepository.SearchCompany(filter));
}