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

MVC同一视图集成分类列表与删除表单的实现疑问

同一视图实现分类列表展示与删除操作

我需要在展示分类(Category)列表的页面中直接添加删除表单,无需单独创建删除视图。以下是我尝试用Tuple传递复合模型实现删除功能的代码,同时补充了必要的优化细节:

控制器代码

namespace MvcProject.Controllers
{
    public class CategoryController : Controller
    {
        // 注入数据库上下文(需提前在Startup/Program.cs中配置依赖注入)
        private readonly ApplicationDbContext _db;

        public CategoryController(ApplicationDbContext db)
        {
            _db = db;
        }

        public IActionResult Index()
        {
            IEnumerable<Category> catList = _db.Categories;
            // 用Tuple封装分类列表和用于接收删除ID的Category对象
            var model = new Tuple<IEnumerable<Category>, Category>(catList, new Category());
            
            return View(model);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Delete(Category categoryToRemove)
        {
            // 优化:先查询存在性,避免无效ID导致的异常
            var targetCategory = _db.Categories.Find(categoryToRemove.Id);
            if (targetCategory != null)
            {
                _db.Categories.Remove(targetCategory);
                _db.SaveChanges();
            }
            
            return RedirectToAction(nameof(Index));
        }
    }
}

Index视图代码(Index.cshtml)

@model Tuple<IEnumerable<Category>, Category>

<div class="container mt-4">
    <h2>分类列表</h2>
    <table class="table table-striped">
        <thead>
            <tr>
                <th>ID</th>
                <th>分类名称</th>
                <th>显示顺序</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var category in Model.Item1.OrderBy(c => c.Id))
            {
                <tr>
                    <td style="width:7%">@category.Id</td>
                    <td>@category.Name</td>
                    <td>@category.DisplayOrder</td>
                </tr>
            }
        </tbody>
    </table>

    <h3>删除分类</h3>
    <!-- 必须指定asp-action指向Delete方法,否则默认提交到Index -->
    <form method="post" asp-action="Delete" class="col-3">
        <div class="form-floating mb-3">
            <input type="number" asp-for="Item2.Id" class="form-control" id="floatingInput" placeholder="输入要删除的分类ID">
            <label for="floatingInput">要删除的分类ID</label>
        </div>
        <button type="submit" style="width:100%" class="btn btn-outline-danger">执行删除</button>
    </form>
</div>

核心细节说明

  • 模型传递:用Tuple将分类列表和用于接收删除参数的Category对象打包,避免创建额外的ViewModel类(如果后续需求复杂,建议改用自定义ViewModel,可读性更强)
  • 表单路由:表单必须通过asp-action="Delete"指定提交目标,否则会默认提交到当前的Index方法,无法触发删除逻辑
  • 删除逻辑优化:原代码直接Attach对象删除存在风险(比如传入不存在的ID会引发异常),改为先通过Find查询目标分类,确认存在后再执行删除更安全
  • 防伪造令牌:保留[ValidateAntiForgeryToken]特性,防止跨站请求伪造攻击

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:18:13