FormData 在数组中追加项目

Posted

技术标签:

【中文标题】FormData 在数组中追加项目【英文标题】:FormData append item in array 【发布时间】:2017-09-09 04:21:42 【问题描述】:
 public List<Region> Regions  get; set; 

在名为 News.An Region Model 的模型中

public class Region
    
        public int Id  get; set; 
        public string Name  get; set; 
        public static Region Parse(DataRow row)
        
            return new Region
            
                Id = Database.GetInteger(row["Id"]),

                Name = Database.GetString(row["Region"]),


            ;
        
    

javascript 中,我使用带有 formdata 的 AJAX 发布方法。我要设置这个区域。

var regionList = [];
            if (selected === "region") 
                if (region.length <= 0) 
                    toastr.warning('Lütfen en az bir bölge seçin !!!');
                    return;
                

                for (var i = 0; i < region.length; i++) 

                    var item = 
                        Id: region[i]
                    
                    regionList.push(item);
                
                console.log(regionList);
                formData.append("Regions", regionList);
            

上面的 JS 代码我这样写来设置它

 public ActionResult AddByRegion(News item)
        
            int refPortal = SessionRepository.GetPortalId();
            if(refPortal!=1)
                return View("List", NewsRepository.ListAll(SessionRepository.GetPortalId()));
            if (item == null
                || string.IsNullOrEmpty(item.Title)
                || string.IsNullOrEmpty(item.Content)
                )
                return Content(Serialization.JsonSerialize(new  Status = 400 ));

            return Content(Serialization.JsonSerialize(new  Status = 200, Result = NewsRepository.AddByRegion(item) ));
        

上面的代码将进入控制器。但它总是返回 0 记录,尽管至少我选择了两个区域。

 $.ajax(
                type: 'POST',
                url: '@Url.Action("AddByRegion", "News")',
                data: formData,

                contentType: false,
                processData: false,
                success: function(data) 
                    var result = JSON.parse(data);
                    if (result.Result === "SUCCEED") 
                        toastr.success('@Resources.Resource.Success_MediaAdd');
                        window.location.reload();
                        return;
                    

                    else 
                        toastr.error('@Resources.Resource.Error_Unexpected');
                        return;
                    
                ,
                error: function(error) 

                    toastr.error('@Resources.Resource.Error_Unexpected');
                    return;
                ,
                beforeSend: function() 
                    waitingDialog.show('Wait...');
                ,
                complete: function() 
                    waitingDialog.hide();
                
            );

上面是我的 Ajax 方法。我在哪里犯错了?

提前致谢。

【问题讨论】:

需要对regionlist进行字符串化 【参考方案1】:
 var regionList = [];
    for (var i = 0; i < region.length; i++) 
        var item = 
            Id: region[i].Id,
            Name : region[i].Name,
        
        regionList.push(item);
    

    regionList = JSON.stringify( "item": regionList );//Here "item" name should match the parameter name in your Action method name in controller (item in your case.)

然后将 regionList 对象作为数据传递给 $.ajax。

 $.ajax(
            type: 'POST',
            url: '@Url.Action("AddByRegion", "News")',
            data: regionList,

            contentType: false,
            processData: false,
            ....
        );

【讨论】:

【参考方案2】:

如果您使用FormData 发送数据,您需要将.append() 每个单独的名称/值发送到FormData。由于它是一个集合,因此您必须包含集合索引器(必须从零开始且连续),例如

formData.append("Regions[0].Id", someValue);
formData.append("Regions[0].Name", someValue);
formData.append("Regions[1].Id", someValue);
formData.append("Regions[1].Name", someValue);

由于您在循环中执行此操作,因此您可以使用

for (var i = 0; i < region.length; i++) 
    formData.append("Regions[" + i + "].Id", region[i])

【讨论】:

是的!这也适用于简单的整数数组。使用 C# 需要 IEnumberable。通过 JSON.stringify 将其作为一个值附加可能不会。

以上是关于FormData 在数组中追加项目的主要内容,如果未能解决你的问题,请参考以下文章

传递对象角度的FormData Item数组

Ajax--FormData表单对象中的实例方法

FormData 是一个具有数组数组的对象

FormData使用方法详解

我们如何在DTO中使用对象数组和nestjs中的multipart-formdata?

我可以在javascript中将数组附加到“formdata”吗?