为什么执行某些操作后我的财产总是为空?剃刀页面

时间:2019-06-07 09:51:43

标签: c# asp.net razor .net-core

我正在使用.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方法并对其进行调试时,它都显示该列表现在为空。为什么会这样?

1 个答案:

答案 0 :(得分:1)

TodoItems将不会在请求中持久存在,因此您在OnGet中分配给它的事实并不意味着仍会在OnPostMarkAsDoneAsync中将其分配给它。就像在OnGet中所做的一样,您将需要从OnPostMarkAsDoneAsync中的DbContext中进行重新提取。