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

ASP.NET Core MVC:新增记录后留存视图并获取Id的实现方法

要实现新增后留在Create视图并显示包含自动生成ID的新增记录,需修改POST方法的返回逻辑,并在视图中添加成功展示区域,具体操作如下:

1. 修改控制器的POST方法

将原有的重定向逻辑改为返回当前Create视图,同时确保保存数据后重新生成下拉框所需的ViewData(视图渲染菜单选择项依赖该数据)。EF Core在执行SaveChangesAsync后,会自动将数据库生成的MenuOrderId赋值给menuOrder对象,直接将该对象传入视图即可。

修改后的POST方法代码:

// POST: MenuOrders/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("MenuOrderId,CustomerName,MasterMenuId,OrderQty,IsPaid,IsCancel")] MenuOrder menuOrder)
{
    if (ModelState.IsValid)
    {
        _context.Add(menuOrder);
        await _context.SaveChangesAsync();
        // 保存成功后重新生成下拉框数据,返回Create视图并传入已保存的实体(含自动生成ID)
        ViewData["MasterMenuId"] = new SelectList(_context.MasterMenu, "MasterMenuId", "MasterMenuId", menuOrder.MasterMenuId);
        return View(menuOrder);
    }

    ViewData["MasterMenuId"] = new SelectList(_context.MasterMenu, "MasterMenuId", "MasterMenuId", menuOrder.MasterMenuId);
    return View(menuOrder);
}

2. 修改Create视图(.cshtml)

在视图中添加条件渲染区域,当MenuOrderId有值(即新增成功)时展示记录详情,同时保留原表单方便用户继续新增订单。

示例视图代码片段:

@{
    ViewData["Title"] = "Create";
}

<h1>Create Menu Order</h1>

<!-- 新增成功提示与记录展示 -->
@if (Model.MenuOrderId != 0)
{
    <div class="alert alert-success">
        <h4>订单新增成功!</h4>
        <p>订单ID:@Model.MenuOrderId</p>
        <p>客户姓名:@Model.CustomerName</p>
        <p>关联菜单ID:@Model.MasterMenuId</p>
        <p>订单数量:@Model.OrderQty</p>
        <p>是否已支付:@(Model.IsPaid ? "是" : "否")</p>
        <p>是否已取消:@(Model.IsCancel ? "是" : "否")</p>
    </div>
}

<!-- 原有订单提交表单 -->
<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="CustomerName" class="control-label"></label>
        <input asp-for="CustomerName" class="form-control" />
        <span asp-validation-for="CustomerName" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="MasterMenuId" class="control-label"></label>
        <select asp-for="MasterMenuId" class ="form-control" asp-items="ViewBag.MasterMenuId"></select>
        <span asp-validation-for="MasterMenuId" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="OrderQty" class="control-label"></label>
        <input asp-for="OrderQty" class="form-control" />
        <span asp-validation-for="OrderQty" class="text-danger"></span>
    </div>
    <div class="form-group form-check">
        <label class="form-check-label">
            <input class="form-check-input" asp-for="IsPaid" /> @Html.DisplayNameFor(model => model.IsPaid)
        </label>
    </div>
    <div class="form-group form-check">
        <label class="form-check-label">
            <input class="form-check-input" asp-for="IsCancel" /> @Html.DisplayNameFor(model => model.IsCancel)
        </label>
    </div>
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
    </div>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

关键说明

  • 若主键类型为Guid而非自增整数,需将视图中的判断逻辑改为@if (Model.MenuOrderId != Guid.Empty)。
  • 必须重新设置ViewData["MasterMenuId"],否则视图下拉框会因缺少数据无法正常渲染。

内容的提问来源于stack exchange,提问作者Haminteu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:31:12