c# - ModelState.IsValid 对于发送带有隐藏输入的 Id 为 false
问题描述
我刚刚开始学习 asp.net core razor pages 并使用教程构建一个简单的项目。这个项目有一个用于编辑书籍的“编辑”剃须刀页面。我正在尝试将我的模型(Book)的 ID 传递给带有隐藏输入的 post 处理程序,因为没有它 Book.Id 将为 0。但是当我使用 asp-for 标签助手并点击更新时提交按钮,Model.IsValid 为 false。但是当在“编辑”页面中我可以看到 URL 中的值时,书的 ID 是通过“索引”页面中的 URL 传递的。这是我的模型:
public class Book
{
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
public string Author { get; set; }
public string ISBN { get; set; }
}
和我用于编辑的cshtml:
<h2 class="text-info">Edit Book</h2>
<div class="container border m-3">
<form method="post">
<input asp-for="Book.Id" type="hidden"/>
<div class="row form-group mt-2">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<label for="title" class="col-sm-2 col-form-label " asp-for="Book.Title"></label>
<div class="col-sm-6">
<input asp-for="Book.Title" class="form-control" id="title"/>
<span asp-validation-for="Book.Title" class="text-danger"></span>
</div>
</div>
<div class="row form-group mt-2">
<label for="author" class="col-sm-2 col-form-label " asp-for="Book.Author"></label>
<div class="col-sm-6">
<input asp-for="Book.Author" class="form-control" id="author"/>
<span asp-validation-for="Book.Author" class="text-danger"></span>
</div>
</div>
<div class="row form-group mt-2">
<label for="ISBN" class="col-sm-2 col-form-label " asp-for="Book.ISBN"></label>
<div class="col-sm-6">
<input asp-for="Book.ISBN" class="form-control" id="ISBN"/>
<span asp-validation-for="Book.ISBN" class="text-danger"></span>
</div>
</div>
<div class="row ">
<div class="col-3 offset-2">
<input type="submit" value="Update" class="btn btn-primary form-control"/>
</div>
<div class="col-3 ">
<a asp-page="Index" class="btn btn-secondary form-control">Back To List</a>
</div>
</div>
</form>
@section scripts{
<partial name="_ValidationScriptsPartial" />
}
和我的 cshtml.cs:
public class EditModel : PageModel
{
private readonly ApplicationDbContext _db;
public EditModel(ApplicationDbContext db)
{
_db = db;
}
[BindProperty]
public Book Book { get; set; }
public async Task OnGet(int id)
{
await _db.Book.FindAsync(id);
}
public async Task<IActionResult> OnPost()
{
if (ModelState.IsValid)
{
var bookFromDb = await _db.Book.FindAsync(Book.Id);
bookFromDb.Title = Book.Title;
bookFromDb.Author = Book.Author;
bookFromDb.ISBN = Book.ISBN;
await _db.SaveChangesAsync();
return RedirectToPage("Index");
}
return RedirectToPage();
}
}
解决方案
但是当在“编辑”页面中我可以看到 URL 中的值时,书的 ID 是通过“索引”页面中的 URL 传递的。
Book
在 PageModel 中只会绑定来自一个来源的数据。所以它不会绑定查询字符串中的数据。
第一种方式,如果你使用隐藏输入Book.Id
,你需要设置值Book
。然后Book.Id
将具有价值,否则发布时为空字符串。更改如下:
public async Task OnGet(int id)
{
Book = await _db.Book.FindAsync(id);
}
另一种方式,您可以设置一个id
as 参数,如OnGet
方法,然后将其设置id
为Book.Id
:
public async Task<IActionResult> OnPost(int id)
{
Book.Id = id;
//...
return RedirectToPage();
}
这样,隐藏的输入 forBook.Id
就没有用了:
<input asp-for="Book.Id" type="hidden" />
推荐阅读
- amazon-web-services - AWS S3 复制对象在本地下载它?
- javascript - 如何在 Strapi 中更新用户
- amazon-web-services - 由于路径较长,AWS 代码构建失败
- laravel - OctoberCMS - 如何从数据库中检索数据到后端图表
- dart - 关于 Dart 中的 toList()
- anylogic - 从托盘架挑选托盘时,资源池驱动程序不会继续移动
- php - 32 秒睡眠后的 PHP/Apache = 无响应
- javascript - 反应:尝试选中/取消选中复选框
- swiftui - 场景相位意外变化
- html - Flex-wrap 似乎不起作用,图像显示在列中