我是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");
}
}
}
答案 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>();
根据我先前与OP的讨论进行编辑:
将控制器操作中的大写字母更改为
public async Task<IActionResult> onPostDelete(int id)
到
public async Task<IActionResult> OnPostDelete(int id)