无法从视图中的异步方法返回值
本文关键字:异步方法 返回值 视图 | 更新日期: 2023-09-27 18:12:47
我试图从async
html helper返回值,但它给出以下字符串而不是所需的值。
" System.Threading.Tasks.Task + WhenAllPromise ' 1(系统。十进制)"
方法:
public async static Task<decimal> CalculateCurrency(this HtmlHelper helper, decimal amount, string from, string country)
{
if (await getValue(country))
{
string fromCurrency = string.IsNullOrEmpty(from) ? "USD" : from;
string toCurrency = country;
WebClient client = new WebClient();
string url = string.Format("http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", fromCurrency.ToUpperInvariant(), toCurrency.ToUpperInvariant());
Stream response = await client.OpenReadTaskAsync(url);
StreamReader reader = new StreamReader(response);
string yahooResponse = await reader.ReadLineAsync();
response.Close();
if (!string.IsNullOrWhiteSpace(yahooResponse))
{
string[] values = Regex.Split(yahooResponse, ",");
if (values.Length > 0)
{
decimal rate = System.Convert.ToDecimal(values[1]);
string res = string.Format("{0:0.00}", rate * amount);
return decimal.Parse(res);
}
}
return decimal.Zero;
}
return decimal.Zero;
}
调用HTML Helper:
@Html.CalculateCurrency(22, "USD", "EUR")
视图不支持异步方法。所以作为结果,你得到的结果是默认的.ToString()
函数的结果类型,它实际上只返回类型名称。
选项:
- 将代码移动到控制器,并使用
await
从异步顶层(非子)操作调用。通过模型或ViewBag
将数据传递给视图 - 转换为真正的同步代码,如果你必须从视图或子操作调用
- 如果不可能尝试
.Result
,但要注意死锁。参见await与Task。等等-僵局?详情/链接。
注意:将async
代码移动到子动作将没有帮助。