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

ASP.NET MVC中获取表格选中行ID并传递至控制器的实现问题

正确实现选中行Id传递到ASP.NET MVC控制器的方案

我来帮你梳理下现有代码的问题,然后一步步给出可行的修正方案:

1. 先修正视图里的小问题

你当前的复选框用了重复的id="chk",这不符合HTML规范(id必须唯一),改成class更合理。另外隐藏的Id列可以保留,但其实我们完全不需要从td里提取Id,直接用复选框的value就足够,逻辑会更简单。

修正后的表格视图代码:

<tbody> 
@foreach (var item in Model.ReqDocumentsViewModel.OrderByDescending(x => x.Id)) 
{  
    <tr class="even pointer">
        <td style="display:none;">@item.Id</td>
        <td>@item.FileType</td>
        <td>@item.Note</td> 
        @if (item.RequestStatus == false) { 
            <td> Not Requested; </td> 
        } else { 
            <td> Requested; </td> 
        } 
        <td>
            <!-- 把重复的id改成class,避免DOM元素标识冲突 -->
            <input type="checkbox" value="@item.Id" class="chk-doc" />
        </td>
        <td>
            <button type="button" onclick="RemoveReqDocument()" class="btn btn-danger">Remove</button>
        </td>
    </tr> 
} 
</tbody>
<button type="button" class="btn btn-primary sm" onclick="SendMailNotification();">Send Request Mail</button>

2. 简化并修正前端JS逻辑

原来的JS代码绕了不必要的弯路,我们可以直接选中所有被勾选的复选框,提取它们的value(也就是目标Id),然后构造成符合后端模型的数组,再发送AJAX请求。

修正后的JS代码:

function SendMailNotification() {
    // 筛选出所有被勾选的复选框,提取Id并转成符合模型的结构
    const selectedIds = $('.chk-doc:checked').map(function() {
        // 把字符串类型的value转成数字,匹配后端int类型的Id
        return { Id: parseInt($(this).val()) };
    }).get(); // 将jQuery对象转换为普通JS数组

    // 增加空选择判断,提升用户体验
    if (selectedIds.length === 0) {
        alert("请至少选择一项再发送请求!");
        return;
    }

    $.ajax({
        type: "POST",
        url: "/Task/RequestDocument",
        data: JSON.stringify(selectedIds),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(r) {
            if (r) {
                alert("邮件请求已成功发送!");
                location.reload();
            } else {
                alert("操作失败,请稍后重试!");
            }
        },
        error: function() {
            alert("请求出错,请检查网络或后台服务状态!");
        }
    });
}

3. 完善控制器方法的参数绑定

需要给控制器的参数加上[FromBody]特性,告诉ASP.NET MVC从请求体中读取JSON数据并绑定到模型列表,同时补充基础的业务逻辑处理:

using System.Web.Mvc;

public class TaskController : Controller
{
    [HttpPost]
    public JsonResult RequestDocument([FromBody]List<ReqDocList> idQs) 
    {
        try
        {
            if (idQs == null || idQs.Count == 0)
            {
                return Json(false);
            }

            // 在这里编写你的核心业务逻辑:比如根据传入的Id列表发送邮件
            // 示例:foreach(var docItem in idQs) { /* 处理每个Id对应的邮件请求 */ }

            return Json(true); // 操作成功返回true
        }
        catch (Exception ex)
        {
            // 可在此处添加日志记录逻辑
            return Json(false); // 操作失败返回false
        }
    }
}

4. 模型代码无需修改

你的ReqDocList模型已经满足需求,保持原样即可:

public class ReqDocList
{
    public int Id { get; set; }
}

这样修改后,当用户勾选复选框并点击按钮时,就能正确收集选中的Id列表,传递到控制器并完成参数绑定,后续你就可以在控制器里实现发送邮件的业务逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:30:35