我试图在WebAPI控制器上发布多个参数。一个参数来自URL,另一个来自正文。这是网址:/offer/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/价格/
这是我的控制器代码:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
正文的内容JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
知道为什么默认绑定无法绑定到控制器的offerPriceParameters
参数吗?它总是设置为null。但是我可以使用DataComptJsonSerializer
从主体中恢复数据。
我也尝试使用参数的FromBody
属性,但它也不起作用。
[HttpPost]
public string MyMethod([FromBody]JObject data)
{
Customer customer = data["customerData"].ToObject<Customer>();
Product product = data["productData"].ToObject<Product>();
Employee employee = data["employeeData"].ToObject<Employee>();
//... other class....
}
使用引用
using Newtonsoft.Json.Linq;
使用JQuery Ajax的请求
var customer = {
"Name": "jhon",
"Id": 1,
};
var product = {
"Name": "table",
"CategoryId": 5,
"Count": 100
};
var employee = {
"Name": "Fatih",
"Id": 4,
};
var myData = {};
myData.customerData = customer;
myData.productData = product;
myData.employeeData = employee;
$.ajax({
type: 'POST',
async: true,
dataType: "json",
url: "Your Url",
data: myData,
success: function (data) {
console.log("Response Data ↓");
console.log(data);
},
error: function (err) {
console.log(err);
}
});
原生WebAPI不支持绑定多个POST参数。正如Colin指出的那样,他引用的我的博客文章中概述了许多限制。
通过创建自定义参数绑定器有一个解决方法。执行此操作的代码丑陋且复杂,但我已经在我的博客上发布了代码以及详细的解释,准备在此处插入到项目中:
将多个简单的POST值传递给ASP.NETWebAPI
如果正在使用属性路由,您可以使用[FromUri]和[FromBody]属性。
示例:
[HttpPost()]
[Route("api/products/{id:int}")]
public HttpResponseMessage AddProduct([FromUri()] int id, [FromBody()] Product product)
{
// Add product
}