以下是对我的问题的简要描述(我可以这样做),以及所有相关代码。我希望这篇文章的措辞会比我之前请求的帮助更清晰一些。
我有一个.NET Web API和一个AngularJS前端。我有一个非常简单的POST方法,它接受"Envelope"类型的参数,如下所示:
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 POST看起来像这样:
$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(坏请求)"。这听起来像是.NET Web API路由问题,但我搞不清楚是什么问题
- 如果我将"内容类型"标头更改为"application/x-www-form-urlencoded",我可以避免400(事实上得到200)。但是,这会导致API将"env"参数视为NULL
- 我倾向于用'[FromBody]'属性修饰我的操作方法参数,但这样做并不能解决API操作方法中'env'为NULL的问题
我用我非常简单的HTML页面创建了一个简单的plunk,用来调用API。可以在这里找到:
http://plnkr.co/edit/hY2OUeg9CRQ1QOz8MGU8?p=info
非常感谢您提供的任何帮助。
"内容类型":"应用程序/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);
}
您应该有一个名为: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; }
}