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

如何在ASP.NET Core 7 MVC CRUD中复用表单实现创建、详情与编辑?

用单个表单实现ASP.NET Core MVC的创建、编辑与显示

这种复用视图的做法完全被ASP.NET Core MVC支持,而且在实际项目中很常见,能有效减少重复代码。下面是具体的实现方案:

1. 模型层准备

确保你的ItemModel包含主键ID(自增类型,默认值0代表新数据)和软删除标识Inactive:

public class ItemModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    // 其他业务字段
    public bool Inactive { get; set; } = false;
}

2. 控制器方法实现

HttpGet方法(统一处理新建、编辑、查看)

创建一个名为Manage的Get方法,通过可选参数id区分不同场景:

[HttpGet]
public IActionResult Manage(int? id)
{
    ItemModel model;
    if (id.HasValue && id.Value > 0)
    {
        // 加载已有数据(排除已软删除的记录)
        model = _dbContext.Items.FirstOrDefault(x => x.ID == id.Value && !x.Inactive);
        if (model == null)
        {
            return NotFound();
        }
    }
    else
    {
        // 初始化新数据模型
        model = new ItemModel();
    }
    return View(model);
}

HttpPost方法(统一处理保存、软删除)

通过表单提交的actionType参数区分操作类型,根据ID判断是新增还是更新:

[HttpPost]
public IActionResult Manage(ItemModel model, string actionType)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    if (actionType == "Delete")
    {
        // 执行软删除:标记Inactive为true
        var existingItem = _dbContext.Items.FirstOrDefault(x => x.ID == model.ID && !x.Inactive);
        if (existingItem != null)
        {
            existingItem.Inactive = true;
            _dbContext.SaveChanges();
        }
    }
    else
    {
        if (model.ID == 0)
        {
            // 新增数据
            _dbContext.Add(model);
        }
        else
        {
            // 更新已有数据
            _dbContext.Update(model);
        }
        _dbContext.SaveChanges();
    }

    return RedirectToAction("Index");
}

3. 视图实现(单个表单)

创建Manage.cshtml视图,根据模型ID控制字段状态和按钮显示:

@model ItemModel

<form asp-action="Manage" method="post">
    <input type="hidden" asp-for="ID" />

    <div class="form-group">
        <label asp-for="Name" class="form-label"></label>
        <input asp-for="Name" class="form-control" @(Model.ID == 0 ? "" : "readonly") />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <!-- 其他业务字段按此格式添加 -->

    @if (Model.ID > 0)
    {
        <!-- 仅对已有数据显示软删除按钮 -->
        <button type="submit" name="actionType" value="Delete" class="btn btn-danger me-2">软删除</button>
    }
    <button type="submit" name="actionType" value="Save" class="btn btn-primary">保存</button>
</form>

关键思路说明

  • 用**可选参数int? id**统一新建(无id/id=0)和编辑/查看(有效id)的入口
  • 通过**actionType参数**区分保存和软删除操作,避免额外的控制器方法
  • 视图中根据ID值动态控制字段是否只读,以及是否显示删除按钮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:23