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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:16