如何在AngularJS中将已检查项目数组传递到对象中?

时间:2016-10-27 09:59:01

标签: c# angularjs asp.net-web-api

我在ng-repeat中附加了一个输入复选框,其中vm.addRemoveItem()的函数ng-change用于存储数组vm.itemsArr中的所有已检查项。我希望能够通过webAPI将数组传递给c#方法,但数组不会传递给我使用的变量。请参阅以下代码中的正确说明

ng-repeat中的复选框

<input type="checkbox" ng-model="item.selected" ng-change="vm.addRemoveItem()" value={{item.id}} /> {{item.title}}

将所有已检查项目存储在数组中的函数

vm.addRemoveItem = function () {
     vm.itemsArr = [];
     angular.forEach(vm.itemList, function (item) {
        if (item.selected) {
           vm.itemsArr.push(item.id);
        }
    })
}

我确认上述功能正常,因为我能够使用alert()显示已检查项目数组的内容。

通过webAPI(我的挑战)将值传递给c#

vm.itemObj= {
    itemInfoId: $stateParams.id,
    itemValues: JSON.stringify(vm.itemsArr)
};

这里的挑战是当我将上述对象itemObj传递给通过webAPI调用的函数时,它返回验证错误,因为itemValues为空但itemInfoId具有正确的值。如何将数组内容传递到itemValues

C#功能

public async Task AddSubjectToClassInfoAsync(AddItemsInput input)
{
   //Code to add values to database 
}

//AddItemsInput Class
public class AddSubjectsInput
{
    public int ItemInfoId { get; set; }

    public string[] ItemValues { get; set; }
}

角度函数调用

vm.add = function () {
    subjectService.addtoDBAsync(vm.itemObj).success(function () {
        $modalInstance.close();
    })
};

2 个答案:

答案 0 :(得分:1)

当您将vm.itemObj的创建直接放在控制器内部时,一旦构建控制器就会创建它,这意味着vm.itemsArr尚未初始化或填充,因此您将获得空引用

将对象vm.itemObj的创建更改为;

vm.itemObj= {
    itemInfoId: $stateParams.id,
    itemValues: []
};

现在你可以直接将项目推送到vm.itemObj.itemValues,或者在需要时将itemValues替换为另一个数组,可能就在你要执行api调用时。

vm.itemObj.itemValues = vm.itemsArr;

答案 1 :(得分:0)

我认为您不需要将参数对象中的数组更改为

 itemValues: JSON.stringify(vm.itemsArr)
处的json字符串,您可以发送数组
 vm.itemsArr 
并且http服务将使用< strong> vm.itemObj 对象