如何在 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));
}
我想使用 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));
}