我遇到了错误
任务> __generation__Index.SearchFilms(string)'返回类型错误
在下面的代码中,我不知道为什么。有问题的行是
<BlazoredTypeahead SearchMethod="SearchFilms"
代码:
@page "/"
@using Blazored.Typeahead
<BlazoredTypeahead SearchMethod="SearchFilms"
@bind-Value="SelectedFilm">
<SelectedTemplate>
@context.Title
</SelectedTemplate>
<ResultTemplate>
@context.Title (@context.Year)
</ResultTemplate>
</BlazoredTypeahead>
@if (SelectedFilm != null)
{
<p>Selected Film is: @SelectedFilm.Title</p>
}
@code {
private List<Film> Films;
private Film SelectedFilm;
protected override void OnInitialized()
{
Films = new List<Film> {
new Film("The Matrix", 1999),
new Film("Hackers", 1995),
new Film("War Games", 1983) };
}
private async Task<List<Film>> SearchFilms(string searchText)
{
return await Task.FromResult(Films.Where(x => x.Title.ToLower().Contains(searchText.ToLower())).ToList());
}
class Film
{
public string Title { get; set; }
public int Year { get; set; }
public Film(string title, int year)
{
Title = title;
Year = year;
}
}
}
答案 0 :(得分:2)
您没有在私有方法中使用异步方法。该代码应为:
<section id="page_network">
<body>
<div id="menu">
<ul>
<li><a href="#page_login">LOGIN</a></li>
<li><a href="#page_network">NETWORK</a></li>
<li><a href="#page_parameters">PARAMETERS</a></li>
</ul>
</div>
<br><br>
<h2> >>> NETWORK <<< </h2>
<!-- MCU START -->
<h3>STATUS: "DISCONNECTED / CONNECTED TO NETWORK x WITH IP y"</h3>
<form id="select_network" action="select_network" method="post">
<label>SELECT WIFI NETWORK:</label>
<select name="SSID">
<option>network1</option>
<option>network2</option>
<option>network3</option>
<option>network4</option>
<option>networkN</option>
</select><br>
<!-- MCU END -->
<label>PASSWORD:</label>
<input type="password" name="pass" id="pass" value="">
<br>
<input type="button" onclick="functionCheckNetworkPassword()" value="CONNECT" id="btn1">
</form>
<!-- MCU (END CAN BE HERE ALSO) -->
</body>
</section>
答案 1 :(得分:1)
我通过将SearchFilms方法更改为以下方法来解决此问题,很奇怪。
private async Task<IEnumerable<Film>> SearchFilms(string searchText)
{
return await Task.FromResult(Films.Where(x => x.Title.ToLower().Contains(searchText.ToLower())).ToList());
}
答案 2 :(得分:1)
在BlazoredTypeahead
上,SearchMethod
是异步的,因为此委托旨在调用后端的数据,并且我们不能阻止UI线程等待结果。通常:
private async Task<IEnumerable<Film>> SearchFilms(string searchText)
{
try
{
var result = await BackendService.SearchFilms(searchText);
return result;
}
catch ( ... )
{
UiShowError( ... )
return empty_list;
}
}
但是对于您而言,不涉及后端操作,并且整个方法都是同步的。然后,编译器将发出警告,因为它们对您的方法没有任何async
操作。
另外,quoting docs:
您必须为SearchMethod参数提供具有以下签名
Task<IEnumerable<T> MethodName(string searchText)
的方法。
一种简单易读的解决方案是在您的方法中进行async
调用:
private async Task<IEnumerable<Film>> SearchFilms(string searchText)
{
var result = Films
.Where(x => x.Title.ToLower().Contains(searchText.ToLower()))
.ToList();
await Task.CompletedTask; // avoid warning (*1)
return result;
}
但是还有其他更多方法可以执行此操作:您可以进行微优化,避免使用async
并将result
转换为task
,请参见aguas's answer。
(* 1)此外,您可以避免在方法上方写#pragma warning disable CS1998
的警告(感谢@Henk Holterman)