您目前的方法有兩個問題。一種是您選擇的方法,另一種是您嘗試在同步上下文中使用它,即使它是異步的。
首先,SingleOrDefaultAsync
與其他異步方法一樣,不返回任何有用的值,而是Task,它是表示異步操作的對象。要獲得上述操作的結果,您必須使用await
。
爲了做到這一點,您應該讓您的方法異步或同步運行的任務(不推薦,因爲它會阻止線程,直到它完成)。或者,您也可以簡單地使用方法的同步版本SingleOrDefault
。
你修改爲異步方法會是這個樣子:
public async Task<IActionResult> Success(string token)
{
var paymentMade = await _context.Payments.SingleOrDefaultAsync(m => m.StripeToken == token);
if (paymentMade == null)
{
return NotFound();
}
return View();
}
運行任務同步是這樣的:
public IActionResult Success(string token)
{
var paymentMade = _context.Payments.SingleOrDefaultAsync(m => m.StripeToken == token).Result;
if (paymentMade == null)
{
return NotFound();
}
return View();
}
但是,你可能會遇到的另一個問題。根據數據類型,SingleOrDefault
和其他此類方法如FirstOrDefault
可能從不返回null。這是所有非空的內置類型,如布爾,整數等,如果你想對所有情況都適用的替代,在try-catch是你最好的選擇的情況下:
try
{
var paymentMade = _context.Payments.First(m => m.StripeToken == token);
}
catch (InvalidOperationException)
{
return NotFound();
}
如果你不想這樣做,那麼考慮分拆東西像這樣:
var temp = _context.Payments.Where(m => m.StripeToken == token);
if (!temp.Count == 0)
{
return NotFound();
}
我想你是在FirstOrDefault之後? – user12345
您是如何定義付款的? –
嘿,不要使用'Async' - 檢查'paymentMate'變量的類型。使用同步版本或「await」。 –