Gon*_*ing 0 c# asp.net-mvc razor async-await
我正在尝试使用异步控制器操作,以遵循典型身份AccountController
代码的模式,但如果我直接访问该页面,则会出现以下错误(如果我在登录后通过重定向静默挂起):
The specified parameter type 'System.Threading.Tasks.Task`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not valid. Only scalar types, such as System.Int32, System.Decimal, System.DateTime, and System.Guid, are supported.
Parameter name: item
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentOutOfRangeException: The specified parameter type 'System.Threading.Tasks.Task`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not valid. Only scalar types, such as System.Int32, System.Decimal, System.DateTime, and System.Guid, are supported.
Parameter name: item
Source Error:
Line 107: public async Task<Candidate> CurrentCandidate()
Line 108: {
Line 109: return await this.Context.Candidate.FindAsync(this.CurrentCandidateId());
Line 110: }
Line 111:
Run Code Online (Sandbox Code Playgroud)
public async Task<ActionResult> Index(int id = 0)
{
// Get current user
var candidate = await base.CurrentCandidate();
if (candidate != null)
{
ApplicationUser user = await UserManager.FindByIdAsync(candidate.CandidateGuid.ToString());
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
/// <summary>
/// Return the current logged-in candidate, based on the current candidate id
/// </summary>
public async Task<Candidate> CurrentCandidate()
{
return await this.Context.Candidate.FindAsync(this.CurrentCandidateId());
}
Run Code Online (Sandbox Code Playgroud)
Context是典型的EF6数据库上下文.
public async Task<int> CurrentCandidateId()
{
if (User.Identity.IsAuthenticated)
{
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
return user.CandidateId.GetValueOrDefault(0);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在俯瞰什么?我是新的异步编码风格的新手,所以随时教我:)
你的CurrentCandidateId
功能是async
并返回一个Task<int>
.DbSet.FindAsync
采取任何类型的对象,但它肯定不知道如何处理Task<int>
.您需要执行await
该任务并将其结果传递给FindAsync
.
public async Task<Candidate> CurrentCandidate()
{
return await this.Context.Candidate
.FindAsync(await this.CurrentCandidateId());
// ^^^^^
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
382 次 |
最近记录: |