将文件更改为IList<;格式文件>;并发送了$http.post请求。AngularJS,ASP.NET核心

将文件更改为IList<;格式文件>;并发送了$http.post请求。AngularJS,ASP.NET核心,angularjs,asp.net-core,Angularjs,Asp.net Core,我的示例仅适用于一个文件。我需要一个文件数组。我使用angularJS 1.7和asp.net-core 2.0 HTML C语言中的模型# 和方法签名 [HttpPost] [Route("create-post")] public async Task<object> PostSaveOnFile(PostViewModel model) { 如果我将C#model更改为IList或IEnumerable,它将只是第一个文件。我不知道如何将我的定

我的示例仅适用于一个文件。我需要一个文件数组。我使用angularJS 1.7和asp.net-core 2.0

HTML

C语言中的模型#

和方法签名

    [HttpPost]
    [Route("create-post")]
    public async Task<object> PostSaveOnFile(PostViewModel model)
    {
如果我将C#model更改为IList或IEnumerable,它将只是第一个文件。我不知道如何将我的定向更改为数组

我不知道如何将我的定向更改为数组


更改
modelSetter
调用以返回数组。

首先需要更新
fileModel
指令以设置文件数组而不是单个文件。您可以使用,但生成的数组将具有
文件列表
类型,我建议您将其转换为
数组
,因为它将与代码中的其他更改一起更加灵活

app.directive('fileModel', ['$parse', function ($parse) {
  return {
     restrict: 'A',
     link: function(scope, element, attrs) {
        var model = $parse(attrs.fileModel);
        var modelSetter = model.assign;

        element.bind('change', function() {
           scope.$apply(function() {
              modelSetter(scope, Array.from(element[0].files));
           });
        });
     }
  };
}]);
为了让ASP.NET Core正确绑定
数组
(或
列表
),您需要使用相同的键将所有数组值添加到
表单数据
。例如,如果你有

public List<string> Strings { get; set; }
因此,您需要更新
transformRequest
函数,以便将文件数组正确添加到
FormData

function (data, headersGetter) {
    var formData = new FormData();
    angular.forEach(data, function (value, key) {
        //you could check if value is FileList
        //but your model can hold array of primitive values like ["val1", "val2", "val3"]
        //this single check for Array covers all cases
        //and you don't need to have different check for FileList
        if (value instanceof Array) {
            for (var i = 0; i < value.length; i++) {
                formData.append(key, value[i]);
            }
            return;
        }

        formData.append(key, value);
    });

    return formData;
}
函数(数据、headersGetter){
var formData=new formData();
角度.forEach(数据、函数(值、键){
//您可以检查值是否为FileList
//但是您的模型可以保存诸如[“val1”、“val2”、“val3”]之类的基本值数组
//此阵列的单一检查涵盖所有情况
//您不需要对文件列表进行不同的检查
if(数组的值实例){
对于(变量i=0;i
没有帮助。现在,在我的模型中,api控制器中的ImgPost null:(
(function (angular) {
    angular.module('app').directive('fileModel', ['$parse', function ($parse) {
      return {
         restrict: 'A',
         link: function(scope, element, attrs) {
            var model = $parse(attrs.fileModel);
            var modelSetter = model.assign;

            element.bind('change', function() {
               scope.$apply(function() {
                  modelSetter(scope, element[0].files[0]);
               });
            });
         }
      };
   }]);
})(window.angular);
app.directive('fileModel', ['$parse', function ($parse) {
  return {
     restrict: 'A',
     link: function(scope, element, attrs) {
        var model = $parse(attrs.fileModel);
        var modelSetter = model.assign;

        element.bind('change', function() {
           scope.$apply(function() {
              ̶m̶o̶d̶e̶l̶S̶e̶t̶t̶e̶r̶(̶s̶c̶o̶p̶e̶,̶ ̶e̶l̶e̶m̶e̶n̶t̶[̶0̶]̶.̶f̶i̶l̶e̶s̶[̶0̶]̶)̶;̶
              modelSetter(scope, element[0].files);
           });
        });
     }
  };
}]);
app.directive('fileModel', ['$parse', function ($parse) {
  return {
     restrict: 'A',
     link: function(scope, element, attrs) {
        var model = $parse(attrs.fileModel);
        var modelSetter = model.assign;

        element.bind('change', function() {
           scope.$apply(function() {
              modelSetter(scope, Array.from(element[0].files));
           });
        });
     }
  };
}]);
public List<string> Strings { get; set; }
formData.append("Strings", "value1");
formData.append("Strings", "value2");
formData.append("Strings", "value3");
function (data, headersGetter) {
    var formData = new FormData();
    angular.forEach(data, function (value, key) {
        //you could check if value is FileList
        //but your model can hold array of primitive values like ["val1", "val2", "val3"]
        //this single check for Array covers all cases
        //and you don't need to have different check for FileList
        if (value instanceof Array) {
            for (var i = 0; i < value.length; i++) {
                formData.append(key, value[i]);
            }
            return;
        }

        formData.append(key, value);
    });

    return formData;
}