【问题标题】:How to POST object + array to WebApi .NET/C# controller using AngularJS $http?如何使用 AngularJS $http 将对象 + 数组发布到 WebApi .NET/C# 控制器?
【发布时间】:2017-11-27 02:16:04
【问题描述】:

我的 C# 模型:

public class MyModel
{
    public string MyString { get; set; }
    public int MyInt { get; set; }
    public List<MyList> MyList { get; set; }
}

public class MyList
{
    public string MyListString { get; set; }
    public int MyListInt { get; set; }
}

我的 C# 方法:

[HttpPost]
public void SomeMethod(MyModel MyModel)
{

我的 AngularJS $http:

$http({
    url: "/api/SomeCtrl/SomeMethod",
    method: "POST",
    data: // WHAT TO PUT HERE?
    headers: { 'Content-Type': 'application/json' }
});

我可以为 MyModel 填写:

data: transportDocumentData.TDShipment,

或 MyModel 中存在的 MyList:

data: JSON.stringify({ Package: transportDocumentData.TDShipment.packageData }),

但我不知道如何填充它们。我尝试了两种选择:

$http({
    url: "/api/SomeCtrl/SomeMethod",
    method: "POST",
    data: myModelData.MyModel,
    data: JSON.stringify({ MyList: myModelData.MyModel.myListData }),
    headers: { 'Content-Type': 'application/json' }
});

这不起作用,因为第二个数据会覆盖第一个数据。 我也试过这个:

var abc = myModelData.MyModel;
$http({
    url: "/api/SomeCtrl/SomeMethod",
    method: "POST",
    data: JSON.stringify({ MyList: myModelData.MyModel.myListData }), abc
    headers: { 'Content-Type': 'application/json' }
});

但在这种情况下,只有 MyList 被填充。

我尝试像这样修改 MyMethod:

[HttpPost]
public void SomeMethod(List<MyModel> MyModel)
{

结果更糟。

那么,它是如何正确完成的呢?

编辑: 我忘了包括这些:

$scope.myListData = [{ myListString: "bar", myListInt: 5 }];

$scope.myData = {
    myString: "foo",
    myInt: 3,
    myListData: $scope.myListData
}

 var myModelData = {
    MyModel: $scope.myData
};

【问题讨论】:

  • 所以,发送myData - 那个将与您在WebApi 中的模型匹配;) 您不需要myModelData。 (WebApi 操作中的变量名称在该上下文中并不重要,只有类型必须匹配)。

标签: c# asp.net-web-api stringify angularjs-http entity-model


【解决方案1】:

您只需要创建一个 JSON 对象,将匹配您的 C# 模型并发送它 - 仅此而已。 WebApi 将完成这项工作(模型绑定)。

所以回答你的问题:

data: // 在这里放什么?

在 Angular 中创建/填充您的 json 模型:

$scope.myListData = [{ myListString: "bar", myListInt: 5 }];

$scope.myData = {
    myString: "foo",
    myInt: 3,
    myListData: $scope.myListData
};

直接通过:

$http({
    url: "/api/SomeCtrl/SomeMethod",
    method: "POST",
    data: $scope.myData
});


你的问题是这样的答案吗?

【讨论】:

  • 我更新了我的问题以使事情更清楚。我的代码中已经有了您的建议。
  • 我已经使用您的示例更新了我的答案 - 只需发送 myData - 将在 WebApi 中匹配您的模型;)您不需要 myModelData。
  • 我已经亲自尝试过您的解决方案。这样public List&lt;MyList&gt; MyList { get; set; } 不会填满。我也试过public MyList MyList { get; set; },只是为了确定,结果是一样的。
  • 嗯...我刚刚在您的示例中发现了一个小问题:在 C# 模型中,您有 public List&lt;MyList&gt; MyList { get; set; } 所以 Angular 模型中的属性名称应该是 myList 但您的示例是myListData - 请在你的代码中检查一下?
  • 另外,问题可能在于绑定您发送的数据 - WebApi 正在使用 Newtonsoft 反序列化 JSON 对象......我过去曾遇到过这个问题 - 我的模型为空,因为在反序列化,但异常是由我从 Angular 发送的无效数据引起的。我通过调试发现,它很深,所以我不记得具体如何找到它。但是,您可以在浏览器开发人员工具中看到您从 Angular 发送的数据,尝试调查是否一切正常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多