You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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对象(关联指定的Kind Sports_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:19