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

如何将Webgrid中View层上传的文件作为参数提交到Controller

问题核心原因

普通jQuery的$.post方法默认使用application/x-www-form-urlencoded格式传输数据,不支持二进制文件上传,需要改用FormData对象封装参数提交。

修复步骤

1. 补全附件选择触发逻辑

你现有代码中点击附件图标没有关联触发隐藏的文件选择框,先新增如下JS:

// 点击附件图标触发当前行的隐藏文件选择框
$(document).on('click', '.attachFileBtn', function () {
    $(this).closest('td').find('.approvalFile').click();
});

2. 替换提交逻辑,使用FormData传文件

将你原有的offboardBtn点击提交逻辑替换为如下代码:

$(document).on("click", '.offboardBtn', function () {
    var url = $(this).data('url');
    var $currentTr = $(this).parents('tr');
    // 读取当前行的表单字段
    var reasonid = $currentTr.find('#ReasonID').val();
    var releasedate = $currentTr.find('.ReleaseDate').val();
    var empID = $(this).data('employeeid');
    var accID = $(this).data('accountid');
    // 读取当前行选中的文件
    var fileInput = $currentTr.find('.approvalFile').get(0);

    // 用FormData封装所有请求参数
    var formData = new FormData();
    formData.append('reasonID', reasonid);
    formData.append('employeeID', empID);
    formData.append('accountID', accID);
    formData.append('releaseDate', releasedate);
    // 追加文件,参数名必须和Controller接收的HttpPostedFileBase参数名完全一致
    if (fileInput.files.length > 0) {
        formData.append('AttachFile', fileInput.files[0]);
    }

    // 用ajax提交,禁止jQuery自动处理数据和设置请求头
    $.ajax({
        url: url,
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function (data) {
            $('#employeeGrid').html(data);
        }
    });
});

3. Controller端补充文件保存逻辑

你现有Controller的参数已经定义了HttpPostedFileBase AttachFile,只要参数名和FormData中追加的key一致,就能正常接收到文件,补充保存逻辑即可:

public ActionResult SaveOffboardingDetails(int reasonID, int employeeID, int accountID, DateTime releaseDate, HttpPostedFileBase AttachFile)
{
    try
    {
        // 附件保存逻辑
        if (AttachFile != null && AttachFile.ContentLength > 0)
        {
            // 自定义存储路径,示例存在App_Data下的Uploads文件夹
            var saveFolder = Server.MapPath("~/App_Data/Uploads/");
            if (!Directory.Exists(saveFolder))
            {
                Directory.CreateDirectory(saveFolder);
            }
            // 生成不重复文件名避免覆盖
            var saveFileName = $"{employeeID}_{DateTime.Now:yyyyMMddHHmmss}_{Path.GetFileName(AttachFile.FileName)}";
            var fullSavePath = Path.Combine(saveFolder, saveFileName);
            // 保存文件到服务器
            AttachFile.SaveAs(fullSavePath);

            // 此处可自行扩展:将文件路径、文件名存入对应业务数据库
        }

        // 原有业务逻辑保持不变
        OnboardedEmpVM objonboardedempVM = new OnboardedEmpVM();
        OnboardedEmployee objonboardedemp = new OnboardedEmployee();
        int result = objOffboardingBLL.SaveOffboardingDetails(reasonID, employeeID, accountID, releaseDate);

        if (releaseDate.Date == DateTime.Now.Date && (reasonID == 2 || reasonID == 4))
        {
            int employeeresult = objOffboardingBLL.OffBoardEmployeeDetails(employeeID);
            int infraresult = objOffboardingBLL.DeleteInfraDetails(employeeID);
            int projectresult = objOffboardingBLL.OffboardProjectDetails(employeeID, accountID);
        }

        // 原有返回逻辑保持不变
    }
    catch (Exception ex)
    {
        // 按需添加异常处理
    }
}

额外注意

如果你的页面外层有form标签,建议添加enctype="multipart/form-data"属性,避免低版本浏览器兼容问题:

<form method="post" enctype="multipart/form-data">
    <!-- 你的WebGrid代码放在这里 -->
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:15:03