将对象数组传递给Angular中的POST

时间:2016-08-12 15:29:07

标签: javascript c# angularjs arrays json

我正在尝试在Angular控制器中创建一个函数,该控制器将TestExpense个对象的数组传递给C#API,然后C#API将它们插入到数据库中。目前,API仅配置为一次执行一个。

我希望传递的数组$scope.TestExpenses的对象由以下构造函数表示:

function TestExpense(employeeId, expenseDate, taskId, expenseTypeId,
    billingCategory, notes, amount, lastUpdatedDate, lastUpdatedBy, dateSubmitted) {
    this.employeeId = employeeId;
    this.expenseDate = expenseDate;
    this.taskId = taskId;
    this.expenseTypeId = expenseTypeId;
    this.billingCategory = billingCategory;
    this.notes = notes;
    this.amount = amount;
    this.lastUpdatedDate = lastUpdatedDate;
    this.lastUpdatedBy = lastUpdatedBy;
    this.dateSubmitted = dateSubmitted;
    this.location = location;
}

$scope.TestExpenses = [];

相关Angular函数的当前状态submitEntriesToDatabase

$scope.submitEntriesToDatabase = function () {
    $http.post('/expense/submitExpense', $scope.TestExpenses)
    .success(function (data, status, headers, config) {

    })
    .error(function (data, status, headers, config) {

    });


};

在C#中,我有以下模型来对应我的TestExpense对象:

public class Expense
{
    public int employeeId { get; set; }
    public string expenseDate { get; set; }
    public int taskId { get; set; }
    public int expenseTypeId { get; set; }
    public int billingCategory { get; set; }
    public string notes { get; set; }
    public float amount { get; set; }
    public string LastUpdatedDate { get; set; }
    public int LastUpdatedBy { get; set; }
    public string dateSubmitted { get; set; }
    public string location { get; set; }
}

处理API中POST的方法:

    public void SubmitExpenses(List<Expense> expenses)
    {

        //using(cnxn)
        //{
        //    using(SqlCommand sqlQuery = new SqlCommand("INSERT INTO Expenses " + 
        //        "(Employee_ID, Task_ID, Expense_Date, Expense_Type_ID, Billing_Category_ID, " + 
        //        "Amount, Notes, Last_Updated_By, Last_Update_Datetime, Date_Submitted, Location) " +
        //        "Values (@employeeId, @taskId, @expenseDate, @expenseTypeId, @billingCategory, @amount, @notes, " +
        //        "@lastUpdatedBy, @lastUpdatedDate, @dateSubmitted, @locationId)", cnxn))
        //    {
        //        sqlQuery.Parameters.Add(new SqlParameter("@employeeId", SqlDbType.Int) { Value = employeeId });
        //        sqlQuery.Parameters.Add(new SqlParameter("@expenseDate", SqlDbType.DateTime) { Value = expenseDate });
        //        sqlQuery.Parameters.Add(new SqlParameter("@taskId", SqlDbType.Int) { Value = taskId });
        //        sqlQuery.Parameters.Add(new SqlParameter("@expenseTypeId", SqlDbType.Int) { Value = expenseTypeId });
        //        sqlQuery.Parameters.Add(new SqlParameter("@billingCategory", SqlDbType.Int) { Value = billingCategory });
        //        sqlQuery.Parameters.Add(new SqlParameter("@notes", SqlDbType.Text) { Value = notes });
        //        sqlQuery.Parameters.Add(new SqlParameter("@amount", SqlDbType.Money) { Value = amount });
        //        sqlQuery.Parameters.Add(new SqlParameter("@lastUpdatedDate", SqlDbType.DateTime) { Value = lastUpdatedDate });
        //        sqlQuery.Parameters.Add(new SqlParameter("@lastUpdatedBy", SqlDbType.Int) { Value = lastUpdatedBy });
        //        sqlQuery.Parameters.Add(new SqlParameter("@dateSubmitted", SqlDbType.DateTime) { Value = dateSubmitted });
        //        sqlQuery.Parameters.Add(new SqlParameter("@locationId", SqlDbType.VarChar) { Value = "Radnor" });


        //        cnxn.Open();
        //        sqlQuery.ExecuteNonQuery();
        //    }
        //}



    }

SubmitExpenses中注释掉的行用于插入单个条目(使用适当的方法签名,而不是现在的内容)。这也是我希望模仿传递给它的List<Expenses> expenses参数的功能。根据我收集的内容,我需要反序列化将代表我的$scope.TestExpenses数组的JSON字符串,但我不确定如何开始从中解析单个Expense对象。

RouteConfig.cs中的相关路线:

routes.MapRoute(
     name:"SubmitExpense",
     url:"expense/submitExpense",
     defaults: new
     {
           controller = "Expense",
           action = "SubmitExpenses"
     }
);

非常感谢任何指导!

3 个答案:

答案 0 :(得分:2)

  

从我收集的内容中,我需要反序列化将代表我的$ scope.TestExpenses数组的JSON字符串,但我不确定如何开始从中解析出各个Expense对象。

简单。在方法签名中使用this装饰器。您为所有控制器设置的默认JSON序列化程序设置将尝试将字符串解析为gst.addObserver(this); 列表 - 如果您使用的是Json.NET,它可以自动处理。

[FromBody]

答案 1 :(得分:1)

  

从我收集的内容中,我需要反序列化将要使用的JSON字符串   代表我的$ scope.TestExpenses数组,但我不确定如何   开始从中解析出单个的Expense对象。

即可。你不需要做任何事情来反序列化。它将被自动反序列化。

POST请求的更好实现就是这个。

$scope.submitEntriesToDatabase = function() {
    var config = {
        method: "POST",
        url: '/expense/submitExpense',
        data: $scope.TestExpenses
    };
    $http(config).then(function(response) {
        //success
    }, function(response) {
        //error
    });
};

如果数组中的属性名称与通用列表中对象的属性名称相同,则web api会自动将javascript数组转换为List<T>

P.S:不要使用.success.error回调,因为它们已经过时了。使用.then

答案 2 :(得分:0)

使用$ http在角度1.x中发布帖子的正确方法是:

$http.post('/my/url',{foo:bar}).then(function(result) {
     console.log(result.data);  // data property on result contains your data
});