Javascript AngularJS$http/.NET Web API-获取400(错误请求)或NULL POST Action方法参数

Javascript AngularJS$http/.NET Web API-获取400(错误请求)或NULL POST Action方法参数,javascript,asp.net,angularjs,Javascript,Asp.net,Angularjs,下面是对我的问题的简要描述(我可以这么说),以及所有相关代码。我希望这篇文章的措辞会比我之前请求的帮助更清晰一些 我有一个.NETWebAPI和一个AngularJS前端。我有一个非常简单的POST方法,它接受“信封”类型的参数,如下所示: public class Envelope { public int listingId { get; set; } public string Description { get; set; } public override s

下面是对我的问题的简要描述(我可以这么说),以及所有相关代码。我希望这篇文章的措辞会比我之前请求的帮助更清晰一些

我有一个.NETWebAPI和一个AngularJS前端。我有一个非常简单的POST方法,它接受“信封”类型的参数,如下所示:

public class Envelope {
    public int listingId { get; set; }
    public string Description { get; set; }

    public override string ToString() {
        return listingId.ToString() + "; " + Description;
    }
}
API上的实际POST方法如下所示:

[EnableCors(origins: "http://simpleapiearl.azurewebsites.net", headers: "*", methods: "*")]
public class EnvelopesController : ApiController {
        // POST: api/Envelopes
        public string Post(Envelope env) {
            return "rval: " + env.ToString() + " (and my addition to env)";
        }
    }
我的前端AngularJS$http帖子如下所示:

        $scope.testPOST = function () {
            var env = {
                listingId:1234,
                Description:"some desc"
            };

            $http({
                method: 'POST',
                url: 'http://simpleApiEarl.azurewebsites.net/api/envelopes',
                data: JSON.stringify(env),
                headers: {
                    'Content-Type': 'application/json'
                }
            }).
            success(function (data, status, headers, config) {
                $scope.postStatus = 'success: ' + data;
            }).
            error(function (data, status, headers, config) {
                $scope.postStatus = 'error: ' + status;
            });
        }
以下是我的问题(编号以便于参考):

  • 使用如上所示的所有代码,当我从页面调用“testPOST()”时,会得到一个“400(错误请求)”。这听起来像是一个.NETWebAPI路由问题,但我不知道它是什么
  • 如果我将“Content-Type”标题更改为“application/x-www-form-urlencoded”,我可以避免400(实际上得到200)。但是,这会导致API将“env”参数视为NULL
  • 我倾向于用“[FromBody]”属性修饰我的action方法参数,但这样做并不能解决API action方法中“env”为NULL的问题
  • 我已经创建了一个简单的plunk,其中包含用于调用API的非常简单的HTML页面。可以在这里找到:


    非常感谢您提供的任何帮助。

    我发现了一篇很棒的博客文章,为我的问题提供了解决方案:


    谢谢大家考虑我的要求

    'Content-Type':'application/x-www-form-urlencoded'

    这将起作用。

    这是控制器:

    public async Task<HttpResponseMessage> GetData(int pageNo, int pageSize)
        {
            HttpResponseMessage response = null;
            int totalPage, totalRecord;
    
            totalRecord = db.Employees.Count();
            totalPage = (totalRecord / pageSize) + ((totalRecord % pageSize) > 0 ? 1 : 0);
    
            var record = (from a in db.Employees
                          orderby a.id
                          select a).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
            DataWithPaging data = new DataWithPaging
            {
                PageNo = pageNo,
                PageSize = pageSize,
                TotalPage = totalPage,
                TotalRecord = totalRecord,
                EmployeeData = record               
    
            };
            response = Request.CreateResponse(HttpStatusCode.OK, data);
    
            return await Task.FromResult(response);
        }
    
    public异步任务GetData(int pageNo,int pageSize)
    {
    HttpResponseMessage响应=null;
    int totalPage,totalRecord;
    totalRecord=db.Employees.Count();
    totalPage=(totalRecord/pageSize)+(totalRecord%pageSize)>0?1:0);
    var记录=(来自db.Employees中的a)
    orderby a.id
    选择a).Skip((pageNo-1)*pageSize.Take(pageSize).ToList();
    DataWithPaging数据=新的DataWithPaging数据
    {
    PageNo=PageNo,
    PageSize=PageSize,
    TotalPage=TotalPage,
    TotalRecord=TotalRecord,
    EmployeeData=记录
    };
    response=Request.CreateResponse(HttpStatusCode.OK,数据);
    返回等待任务。FromResult(响应);
    }
    
    您应该有一个名为:DataWithPaging的类

    public class DataWithPaging
    {
        public int PageNo { get; set; }
        public int PageSize { get; set; }
        public int TotalPage { get; set; }
        public int TotalRecord { get; set; }
        public List<Employee> Employees { get; set; }
    }
    
    带有分页的公共类数据
    {
    公共int PageNo{get;set;}
    公共int PageSize{get;set;}
    公共整数页{get;set;}
    公共整数TotalRecord{get;set;}
    公共列表雇员{get;set;}
    }