【问题标题】:How to fill in the fields with values in a form based on an item clicked ( ASP.NET Core Razor page)?如何根据单击的项目(ASP.NET Core Razor 页面)用表单中的值填充字段?
【发布时间】:2021-11-22 21:44:54
【问题描述】:

咖啡店是使用 ASP.NET Core Razor 页面创建的。咖啡模型已创建,所有可用的咖啡都存储在数据库(ef 核心)中。 我们有两页。第一页显示了所有咖啡(id、title、cost、...)信息的表格。每杯咖啡都有一个编辑“按钮”。

<tbody>
        @foreach (var item in Model._coffeeItems)
        {....
                <td>
                    @item.Price &euro; 
                </td>

                <td>
                    <a asp-action= "GetCoffeeItem" >Edit</a> 
                    <a asp-action="RemoveCoffeeItem" >Delete</a>
                </td> ...

单击时应重定向到带有表单的编辑页面。所有字段都必须填写咖啡信息,以便于编辑。

在第一页 CoffeeItemProvider.cs:

public async Task<FoodItem> GetCoffeeItem(int id)
        {
            var item = await _db.CoffeeItems
            .FirstOrDefaultAsync(i => i.Id == id);

            return item;
        }
public async Task UpdateCoffeeItem(int id, CoffeeItem item)
        {
            _db.CoffeeItems.Update(item);
            await _db.SaveChangesAsync();
        }

在编辑页面中:

<form asp-action="UpdateCoffeeItem">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="Id" />
    <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control"  value = ""/>
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>

如何填写输入 f.ex。值 = "@item.Name" 的名称?

有什么方法可以让 GetCoffeeItem 在单击时从首页项目中获取 id - 调用 GetCoffeeItem- 获取项目 - 然后重定向到 /Edit 页面,并分配值 = "@item.Smth"?

【问题讨论】:

  • Razor 页面中没有控制器或操作。你确定你没有使用 MVC?
  • @MikeBrind,更正它是一项服务
  • @MariaHussey “这是一项服务”是什么意思?如果您指的是网络服务,那么您为什么要使用 Razor/cshtml?

标签: c# asp.net razor-pages


【解决方案1】:

我最终为 /Edit 页面创建了一个 EditModel。 重做一点@balinta 答案。

<a asp-page="./Edit" asp-route-id="@item.Id">Edit</a>


                        <button class="btn btn-primary" type="submit" asp-page-handler="delete"
                        asp-route-id="@item.Id">Delete
                        </button>

并在 Edit.cshtml.cs 中:

刚刚在顶部添加了@page "{id:int?}"。并实施

public async Task<IActionResult> OnGetAsync(int id)  function.

【讨论】:

    【解决方案2】:

    怎么样:

    ...
    <td>
        <a asp-action="GetCoffeeItem" asp-route-id="@item.Id">Edit</a>
        <a asp-action="RemoveCoffeeItem" asp-route-id="@item.Id">Delete</a>
    </td>
    ...
    

    并在 GetCoffeeItem 中返回编辑视图,例如:

    return View("Edit", coffeeModel);
    

    【讨论】:

    • 什么是 asp-route-id?它需要任何任务吗?
    • 我强烈建议避免在 tag-helpers 中使用硬编码的动作名称 - 而是使用 nameof() 以确保您始终拥有正确的动作名称字符串。
    • @Dai,由于某种原因,我得到 View 在当前上下文中不存在。
    • @MariaHussey 这不是一个有用的错误消息描述。请提供更多详细信息:它是一个例外还是只是一个标准输出/日志消息?什么是堆栈跟踪? 你在使用你的调试器吗?如果没有,为什么不呢?
    • @MariaHussey 请确保在返回编辑视图时使用正确的名称(即将“编辑”替换为实际名称)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2020-10-16
    • 2020-03-17
    • 2021-08-05
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多