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

使用jQuery Ajax向MVC控制器传递对象列表与ID时参数为空

问题:Ajax传递数据到MVC控制器时参数为空

尝试将auctionId与picList对象列表传递至MVC控制器,但控制器接收的两个参数均为空。参考Stack Overflow各类方案修改代码后问题仍未解决,甚至简化测试(传递{"Name": "Adam"}并在控制器新增对应参数)也无法成功传值。

JSON.stringify(data)输出结果:auctionId为数字类型,picList是包含多个对象的数组,每个对象包含ImageId、FileName、FileLocation、SortOrder字段。


相关代码

视图模型

public class FileViewModel
{
    public FileViewModel()
    {
        UnitPicturesList = new List<UnitPictures>();
    }

    public IList<IFormFile> Files { get; set; }
    [Required]
    public int AuctionId { get; set; }
    public string FileLocation { get; set; }
    public List<UnitPictures> UnitPicturesList { get; set; }
}

模型

public class UnitPictures
{
    public long ImageId { get; set; }
    public string FileName { get; set; }
    public string FileLocation { get; set; }
    public int SortOrder { get; set; }
}

控制器方法

[HttpPost]
public ActionResult UnitImages(long auctionId, List<UnitPictures> picList)
{ ... }

Ajax调用代码

function UpdateImages(auctionId, picList) {
    var data = { auctionId: auctionId, picList: picList };
    console.log(JSON.stringify(data));
     
    $.ajax({
           cache: false, 
           contentType: "application/json; charset=utf-8",
           dataType: "json", 
           type: "POST", 
           url: '/PhotoUploader/UnitImages',
           data: JSON.stringify(data), 
           success: function(data){ 
               if(data.Result == 1) { 
                   alert("images where successfully updated.");
               }else { 
                   alert('images where successfully updated.'); 
               }
           }, 
           error: function() { 
               alert("The images were not updated because of a problem.")
           }
   });
}

解决方法

  1. 改用视图模型接收参数
    MVC对多复杂参数的绑定支持有限,建议统一使用视图模型接收。修改控制器方法:

    [HttpPost]
    public ActionResult UnitImages([FromBody] FileViewModel model)
    {
        // 直接通过model.AuctionId获取ID,model.UnitPicturesList获取图片列表
    }
    

    同步修改Ajax的data结构,匹配视图模型的属性名:

    var data = { AuctionId: auctionId, UnitPicturesList: picList };
    
  2. 添加[FromBody]特性
    传递JSON格式数据时,必须为控制器参数添加[FromBody]特性,明确告诉框架从请求体中解析数据,而非URL或表单参数。

  3. 严格匹配参数大小写
    C#是大小写敏感语言,Ajax传递的JSON字段名必须与控制器参数/视图模型属性名完全一致。例如视图模型中的AuctionId(首字母大写),Ajax中不能写成auctionId。

  4. 验证路由正确性
    确认/PhotoUploader/UnitImages路由可正确映射到目标控制器方法,检查控制器类是否添加了[Route("PhotoUploader")]特性,或默认路由配置是否正常。

  5. 检查JSON格式
    浏览器控制台输出的JSON需确保格式合法,比如数组闭合、字段名无拼写错误,避免因格式问题导致绑定失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:31