ASP.NET核心剃须刀页面值不能为null

时间:2020-07-20 14:08:03

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

我是ASP.NET核心和剃须刀页面的新手。 我创建了一个按钮,并分配了一个页面处理程序以删除该条目。 当我尝试删除即时消息时,出现空引用错误。 当我运行代码并单击按钮删除条目时, 我收到一个空异常错误

我想知道我在哪里出错,并提供一些改进我的编码的指导。 预先感谢您的帮助。

这是我的索引页

@page
@model BookList.Pages.BookPages.IndexModel

       
            <form method="post">
                @if (Model.Books.Count()>0)
                {
                    <table class="table table-dark border">
                        <tr class="table-secondary">
                         @foreach (var book in Model.Books)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(m => book.Name)
                                </td>
                                <td>
                                    @Html.DisplayFor(m => book.Author)
                                </td>
                                 <td>
                                    <button class="btn btn-danger btn-sm" asp-page-handler="Delete" asp-route-id="@book.Id" onclick="return confirm('Are you sure you want to delete?')">Delete</button>
                                    <a class="btn btn-success btn-sm" asp-route-id="@book.Id" asp-page="Edit">Edit</a>
                                   
                                </td>
                            </tr>
                        }
                    </table>
                }
                else
                {
                    <p>No books available</p>
                }
            </form>
       

这是我的页面模型

        public IEnumerable<Book> Books { get; set; }

        public async Task OnGet()
        {
            Books = await _dbContext.Books.ToListAsync();
        }
        
        
        public async Task<IActionResult> onPostDelete(int id)
        {
            var book = await _dbContext.Books.FindAsync(id);

            if (book == null)
                return NotFound();

            _dbContext.Books.Remove(book);

            await _dbContext.SaveChangesAsync();

            return RedirectToPage("Index");

        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试在页面中发送模型,例如

var allBooks=  await _dbContext.Books.ToList();

return View(allBooks);

如果这不起作用,请分享您的整个错误页面,其中可能包含严重的解释。

答案 1 :(得分:0)

根据堆栈跟踪,Model.Books为空。 当您尝试.Count()空集合时,将得到空异常。

您可以在剃刀视图中更换

@if (Model.Books.Count()>0)

使用

@if (Model.Books?.Count()>0)

通过null-conditional operator处理null。

否则,请从以下位置在控制器处处理null

Books = await _dbContext.Books.ToListAsync();

Books = (await _dbContext.Books.ToListAsync()) ?? new List<Book>();

通过null coalescing operator

根据我先前与OP的讨论进行编辑

将控制器操作中的大写字母更改为

public async Task<IActionResult> onPostDelete(int id)

public async Task<IActionResult> OnPostDelete(int id)