Javascript AngularJS$http使用参数中的对象访问ASP.NET Web Api

Javascript AngularJS$http使用参数中的对象访问ASP.NET Web Api,javascript,asp.net,angularjs,asp.net-web-api,Javascript,Asp.net,Angularjs,Asp.net Web Api,我试图使用传递到服务器端的筛选对象从服务器获取筛选数据。我通过一个帖子成功地实现了这一点: 角度: var filter: { includeDeleted: true, foo: bar }; $http({ method: 'post', url: 'api/stuff', data: filter }); web api: public IEnumerable<StuffResponse> Post([FromBody]Filter filter) { return

我试图使用传递到服务器端的筛选对象从服务器获取筛选数据。我通过一个帖子成功地实现了这一点:

角度:

var filter: { includeDeleted: true, foo: bar };
$http({ method: 'post', url: 'api/stuff', data: filter });
web api:

public IEnumerable<StuffResponse> Post([FromBody]Filter filter)
{
    return GetData(filter);
}
web api

public IEnumerable<StuffResponse> Get([FromUri]Filter filter)
{
    return GetData(filter);
}
public IEnumerable Get([FromUri]过滤器)
{
返回GetData(过滤器);
}
还尝试指定参数:{filter:filter}。
如果我尝试[FromBody]或什么都不尝试,则筛选器为null。使用FromUri,我至少可以得到一个对象——但没有数据。在不为所有筛选器属性创建输入参数的情况下,如何解决此问题?

HTTP GET请求不能包含要发布到服务器的数据。您需要的是向请求添加查询字符串。幸运的是
angular.http
为它提供了一个选项
params


请参阅:$http#get

是您可以使用get方法发送数据,方法是使用
params
选项发送数据

var data ={
  property1:value1,
  property2:value2,
  property3:value3
};

$http({ method: 'GET', url: 'api/controller/method', params: data });
您将通过在api控制器方法中使用
[FromUri]
来接收此消息

public IEnumerable<StuffResponse> Get([FromUri]Filter filter)
{
    return GetData(filter);
}
这样解决:

角度:

$http({
       url: '/myApiUrl',
       method: 'GET',
       params: { param1: angular.toJson(myComplexObject, false) }
      })
C#:

[HttpGet]
公共字符串Get(字符串参数1)
{
Type1 obj=newJavaScriptSerializer()。反序列化(param1);
...
}

您可以使用Get或Post方法发送对象

脚本

//1.
var order = {
     CustomerName: 'MS' };
//2.
var itemDetails = [
     { ItemName: 'Desktop', Quantity: 10, UnitPrice: 45000 },
     { ItemName: 'Laptop', Quantity: 30, UnitPrice: 80000 },
     { ItemName: 'Router', Quantity: 50, UnitPrice: 5000 }
];
//3.
$.ajax({
     url: 'http://localhost:32261/api/HotelBooking/List',
     type: 'POST',
     data: {order: order,itemDetails: itemDetails},
     ContentType: 'application/json;utf-8',
     datatype: 'json'
    }).done(function (resp) {
        alert("Successful " + resp);
    }).error(function (err) {
        alert("Error " + err.status);});
API代码

[Route("api/HotelBooking/List")]
[HttpPost]
public IHttpActionResult PostList(JObject objData)
{  List<ItemDetails > lstItemDetails = new List<ItemDetails >();
   dynamic jsonData = objData;
   JObject orderJson = jsonData.itemDetails;
   return Ok();}
[路线(“api/酒店预订/列表”)]
[HttpPost]
公共IHttpActionResult PostList(作业对象对象数据)
{List lstItemDetails=new List();
动态jsonData=objData;
JObject orderJson=jsonData.itemDetails;
返回Ok();}

我认为您无法传递数据以获取方法的简单删除[FromUrl]属性,并确保在作为公共属性包含的Filter类中,它应该可以工作。标准媒体类型格式化程序不会这样做。需要自定义媒体类型格式化程序。如您在“get”示例中所见,我使用的是“params”。我可以看到filter对象在请求中被转换为URL参数-但是服务器不能将其反序列化为filter对象filter是一个类名,所以你不能这样做,你不能在查询字符串中传递类,所以你需要将类更改为string,int,float…Vil的回答提供了一个更清晰的解决方案,这就是POST。它和get一起工作吗?再加上它不是角JS。
[HttpGet]
public string Get(string param1)
{
     Type1 obj = new JavaScriptSerializer().Deserialize<Type1>(param1);
     ...
}
//1.
var order = {
     CustomerName: 'MS' };
//2.
var itemDetails = [
     { ItemName: 'Desktop', Quantity: 10, UnitPrice: 45000 },
     { ItemName: 'Laptop', Quantity: 30, UnitPrice: 80000 },
     { ItemName: 'Router', Quantity: 50, UnitPrice: 5000 }
];
//3.
$.ajax({
     url: 'http://localhost:32261/api/HotelBooking/List',
     type: 'POST',
     data: {order: order,itemDetails: itemDetails},
     ContentType: 'application/json;utf-8',
     datatype: 'json'
    }).done(function (resp) {
        alert("Successful " + resp);
    }).error(function (err) {
        alert("Error " + err.status);});
[Route("api/HotelBooking/List")]
[HttpPost]
public IHttpActionResult PostList(JObject objData)
{  List<ItemDetails > lstItemDetails = new List<ItemDetails >();
   dynamic jsonData = objData;
   JObject orderJson = jsonData.itemDetails;
   return Ok();}