如何在C#中从Datastore实体获取Key以更新和删除记录?
解决Datastore实体Key获取与更新删除问题
我来帮你梳理下怎么从Datastore实体获取Key并实现更新删除操作,结合你给出的代码来看,主要有几处需要调整的地方:
1. 修正Razor页面的路由参数绑定问题
你当前Razor页面里的Edit和Delete链接存在参数传递错误,asp-route-Id="SportsStoreList[i].Id"只是传递了字符串字面量,而不是实际的实体ID值。需要改成@Model.SportsStoreList[i].Id来输出变量值:
@page @using TestApp.Models @model AllSportsStoreModel <h2>Index</h2> <p> <a asp-page="SportsStore">New Item</a> </p> <table class="table"> <thead> <tr> <th> @Html.DisplayName("ID") </th> <th> @Html.DisplayName("Name") </th> <th> @Html.DisplayName("Price") </th> <th>Edit | Delete</th> </tr> </thead> <tbody> @for (var i = 0; i < Model.SportsStoreList.Count; i++) { <tr> <td> @Html.DisplayFor(model => model.SportsStoreList[i].Id) </td> <td> @Html.DisplayFor(model => model.SportsStoreList[i].PName) </td> <td> @Html.DisplayFor(model => model.SportsStoreList[i].Price) </td> <td> <a asp-page="EditStore" asp-route-Id="@Model.SportsStoreList[i].Id">Edit</a> | <a asp-page-handler="Delete" asp-route-Id="@Model.SportsStoreList[i].Id">Delete</a> </td> </tr> } </tbody> </table> <br />
2. 确认Datastore Key处理逻辑
你已经在DatastoreBookStoreExtensionMethods里实现了Key和ID的转换方法,这个逻辑是正确的:
ToKey(long id):将实体ID转换为Datastore需要的Key对象(关联指定的KindSports_db)ToId(Key key):从Datastore的Key对象中提取实体ID
这个转换逻辑完全符合Datastore的文档要求("a key is stored as an object not as a value"),是Datastore操作的核心。
3. 验证后端更新/删除逻辑
你的后端DatastoreSportsStore类里的更新和删除方法逻辑是正确的:
Delete(long id):通过ID生成Key,调用_db.Delete删除实体Update(Item item):将Item转换为Entity(通过ToEntity方法用Item的ID生成Key),调用_db.Update更新实体
补充:Edit页面的示例实现
为了确保Edit功能正常,你可以参考下面的EditStore页面代码,接收ID并查询实体:
@page "{Id}" @using TestApp.Models @model EditStoreModel <h2>Edit Item</h2> <form method="post"> <div class="form-group"> <label asp-for="Item.PName"></label> <input asp-for="Item.PName" class="form-control" /> </div> <div class="form-group"> <label asp-for="Item.Price"></label> <input asp-for="Item.Price" class="form-control" /> </div> <input type="hidden" asp-for="Item.Id" /> <button type="submit" class="btn btn-primary">Save</button> </form>
对应的后端代码:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using TestApp.Models; namespace TestApp.Pages { public class EditStoreModel : PageModel { private readonly ISportsStore _stores; public EditStoreModel(ISportsStore stores) { _stores = stores; } [BindProperty] public Item Item { get; set; } public IActionResult OnGet(long id) { Item = _stores.Read(id); if (Item == null) { return NotFound(); } return Page(); } public IActionResult OnPost() { if (!ModelState.IsValid) { return Page(); } _stores.Update(Item); return RedirectToPage("AllSportsStore"); } } }
补充:Delete Handler的实现
在AllSportsStoreModel里补充Delete handler:
public IActionResult OnGetDelete(long id) { _stores.Delete(id); return RedirectToPage(); }
这样整个更新和删除流程就可以正常工作了,核心是确保前端正确传递实体ID,后端通过ID生成Datastore的Key对象来执行操作。
内容的提问来源于stack exchange,提问作者Dan Nick
相关产品推荐
相关产品推荐

