我正在使用.NET Core 2.2在Razor Pages中创建一个简单的todo应用程序:
public class IndexModel : PageModel
{
private readonly ApplicationDbContext _context;
public List<TodoItem> TodoItems { get; set; }
public IndexModel(ApplicationDbContext context)
{
_context = context;
}
public async Task OnGet()
{
TodoItems = await _context.TodoItems.Where(t => t.IsDone == false).ToListAsync();
}
但是只要我执行此代码:
public async Task<IActionResult> OnPostMarkDoneAsync(int id)
{
if (!ModelState.IsValid)
{
return Page();
}
var item = TodoItems.First(t => t.Id == id);
item.IsDone = true;
_context.TodoItems.Update(item);
var ok = await _context.SaveChangesAsync();
if (ok != 1)
{
return BadRequest(500);
}
return RedirectToPage();
}
我总是得到一个空异常。此外,即使它在同一页面中。
启动应用程序时,将使用正确的数据填充TodoItems列表。但是,每当我执行OnPostMarkDoneAsync方法并对其进行调试时,它都显示该列表现在为空。为什么会这样?
答案 0 :(得分:1)
TodoItems将不会在请求中持久存在,因此您在OnGet中分配给它的事实并不意味着仍会在OnPostMarkAsDoneAsync中将其分配给它。就像在OnGet中所做的一样,您将需要从OnPostMarkAsDoneAsync中的DbContext中进行重新提取。