如何在MVC中实现按钮/链接按钮跨视图传递数据及模型值?
我来帮你搞定这两个MVC里的传值问题,结合你给出的ViewModel和DeliverySchedule模型,给你具体的实现方案:
1. 表格内按钮传递值到另一个视图
表格里的按钮(比如删除、编辑按钮)通常需要把当前行的关键值(比如Id)传递到控制器,再跳转到目标视图。这里有两种常用的实现方式:
方式一:使用Html.ActionLink生成带参数的链接按钮
这种方式会生成一个GET请求的链接,适合跳转查看类的操作;如果是删除这类修改数据的操作,更推荐用下面的表单提交方式(更安全):
@model ViewModel <table class="table"> <thead> <tr> <th>ID</th> <th>拆分日期</th> <th>拆分时段</th> <th>操作</th> </tr> </thead> <tbody> @foreach (var schedule in Model.ScheduleList) { <tr> <td>@schedule.Id</td> <td>@schedule.split_date</td> <td>@schedule.split_hour</td> <td> <!-- 生成指向Delete Action的链接,传递当前行的Id --> @Html.ActionLink("删除", "Delete", new { id = schedule.Id }, new { @class = "btn btn-danger" }) </td> </tr> } </tbody> </table>
对应的控制器Delete方法处理完逻辑后,跳转到目标视图:
public ActionResult Delete(int id) { // 这里写你的删除逻辑,比如从数据库移除对应Id的记录 var targetSchedule = _yourDbContext.DeliverySchedules.FirstOrDefault(s => s.Id == id); if (targetSchedule != null) { _yourDbContext.DeliverySchedules.Remove(targetSchedule); _yourDbContext.SaveChanges(); } // 准备目标视图需要的模型数据 var viewModel = new ViewModel { ScheduleList = _yourDbContext.DeliverySchedules.ToList() }; // 跳转到列表视图(替换成你实际的目标视图名称) return View("ScheduleList", viewModel); }
方式二:使用表单提交按钮(更安全的POST请求)
对于删除、修改这类会改变数据的操作,POST请求更安全,还能配合防伪令牌防止CSRF攻击:
@model ViewModel <table class="table"> <!-- 表头部分同上 --> <tbody> @foreach (var schedule in Model.ScheduleList) { <tr> <!-- 表格内容同上 --> <td> @using (Html.BeginForm("Delete", "YourControllerName", new { id = schedule.Id }, FormMethod.Post)) { // 添加防伪令牌,增强安全性 @Html.AntiForgeryToken() <input type="submit" value="删除" class="btn btn-danger" /> } </td> </tr> } </tbody> </table>
控制器方法需要加上[HttpPost]和[ValidateAntiForgeryToken]特性:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id) { // 逻辑同上,处理删除后跳转目标视图 // ... }
2. 点击链接按钮传递模型值到另一个视图
如果需要传递完整的DeliverySchedule模型到另一个视图,有几种可行的方案,推荐优先用传递关键ID再重新获取模型的方式,避免直接传递大量数据:
方式一:通过路由参数传递Id,重新获取完整模型
这是最常用也最安全的方式,只传递关键的Id,在目标Action里从数据库或数据源重新获取完整模型:
@model ViewModel @foreach (var schedule in Model.ScheduleList) { <div class="mb-2"> @Html.ActionLink("查看详情", "ScheduleDetail", new { id = schedule.Id }, new { @class = "btn btn-info" }) </div> }
控制器的目标Action:
public ActionResult ScheduleDetail(int id) { // 根据Id获取完整的DeliverySchedule对象 var scheduleDetail = _yourDbContext.DeliverySchedules.FirstOrDefault(s => s.Id == id); var viewModel = new ViewModel { ScheduleDetail = scheduleDetail }; // 跳转到详情视图 return View("ScheduleDetailView", viewModel); }
方式二:使用TempData临时存储模型(跨Action传递)
如果不想重新查询数据,可以用TempData临时存储模型,它会保留到下一次请求结束:
@model ViewModel @foreach (var schedule in Model.ScheduleList) { @using (Html.BeginForm("PassScheduleToView", "YourControllerName", FormMethod.Post)) { // 用隐藏字段存储模型的所有属性 @Html.HiddenFor(m => schedule.Id) @Html.HiddenFor(m => schedule.split_date) @Html.HiddenFor(m => schedule.split_hour) @Html.HiddenFor(m => schedule.split_qty) @Html.HiddenFor(m => schedule.remarks) <input type="submit" value="传递模型" class="btn btn-primary" /> } }
控制器代码:
[HttpPost] public ActionResult PassScheduleToView(DeliverySchedule schedule) { // 把模型存入TempData TempData["TargetSchedule"] = schedule; // 重定向到目标视图的Action return RedirectToAction("TargetView"); } public ActionResult TargetView() { // 从TempData取出模型 var schedule = TempData["TargetSchedule"] as DeliverySchedule; var viewModel = new ViewModel { ScheduleDetail = schedule }; return View(viewModel); }
注意:
TempData只在一次请求内有效,如果你需要多次访问,可以改用Session,但记得在不需要时清理Session,避免内存占用。
内容的提问来源于stack exchange,提问作者Kerzoz
相关产品推荐
相关产品推荐

