我已经在这个问题上待了一整天了,我在帖子后阅读了帖子,但我仍然被卡住了。我正在尝试为我们的网络部门开发内部网服务目录。我希望能够将一组JSON对象发送到服务器,每个对象都是订单中的一个项目。我很乐意使用MVC或Web API控制器。到目前为止,它主要是一个MVC项目。
我的ajax电话:
reset()
我正在生成的JSON请求(来自Fiddler)
$.ajax({
url: url,
async: true,
type: "POST",
data: JSON.stringify({ "OrderItems": OrderItems }),
dataType:'json',
contentType: "application/json",
error: function (jqXHR, textStatus, errorThrown) {
},
success: function (data, textStatus, jqXHR) {
console.log("order sent!");
}
});
Order类:
{
"OrderItems": [
{
"Manufacturer": "Cisco",
"PartNumber": "WS-C3650-24PS-S",
"Description": "Cisco Catalyst 3650 24 Port PoE 4x1G Uplink IP Base",
"Price": "3510.00",
"Quantity": 1,
"TotalPrice": "3510.00"
},
{
"Manufacturer": "Cisco",
"PartNumber": "WS-C3650-48PS-S",
"Description": "Cisco Catalyst 3650 48 Port PoE 4x1G Uplink IP Base",
"Price": "5500.00",
"Quantity": 1,
"TotalPrice": "5500.00"
}
]
}
OrderItem类:
public class Order
{
public int ID { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
我尝试构建MVC和Web Api 2控制器以在数据库中获取此信息。我的MVC控制器总是将ObjectItem JSON视为null,而Web Api 2 Controller无法将数组转换为列表。我的大脑现在坏了。
如果有人能告诉我创建控制器的方法我正在寻找我会非常感激。
修改
目前我正在使用自动生成的Web API 2控制器
public class OrderItem
{
public int ID { get; set; }
public string Manufacturer { get; set; }
public string PartNumber { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public decimal TotalPrice { get; set; }
}
编辑2
这是一个MVC控制器,基于Immersive的提示,如下所示。我构建了一些JSON响应,所以我可以尝试看看发生了什么。 ModelState无效,因此我返回最后一个返回响应,它显示一个空数组。这与我尝试过的任何MVC控制器基本上都是一样的问题:它们都没有对JSON数据进行任何操作。
编辑3
基于Immersive的提示,我有一个API控制器的小动作。这个解决了它无法反序列化数组的错误,因为它需要一个JSON数组......我不知道为什么我的数据不合格。
// POST api/Order
[ResponseType(typeof(Order))]
public IHttpActionResult PostOrder(Order order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Orders.Add(order);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = order.ID }, order);
}
编辑4
这是一个基于Thufir输入的MVC控制器,但模型状态始终显示无效。我的JSON在JSONlint检出。我使用'漂亮'版本JSONlint验证了上面的例子。
[ResponseType(typeof(Order))]
public IHttpActionResult PostOrder(List<OrderItem>orderitems)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Order order = new Order();
order.OrderItems = orderitems;
db.Orders.Add(order);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = order.ID }, order);
}
答案 0 :(得分:2)
首先,我会在这里检查你的JSON是否有效:http://jsonlint.com/
其次,尝试替换此行:
public ActionResult Create([Bind(Include="ID")] List<OrderItem>OrderItems)
用这个:
public ActionResult Create(Order model)
更新1:您应该检查您的JSON.Stringify实际输出的内容,我不清楚如何将该对象放在一起,因此可能值得检查。我有预感,这里的大部分问题都在JavaScript中。
更新2:通常在使用JSON.Stringify之前我创建我的对象(用循环或其他东西填充数组):
var myObject = {
myName: 'Big Bob',
myItems: someArrayHere
}
然后在我的AJAX调用中写下这个:
data: JSON.Stringify(myObject)
以下是我喜欢将对象组合在一起并对其进行字符串化的方法:
答案 1 :(得分:1)
以下是如何使用您的输入数据作为ApiController执行此操作,如果需要,您应该能够转换为视图。
保持您的数据类,将Action更改为OrderItem数组
public class OrderController : ApiController
{
public Order PostOrder([FromBody] OrderItem[] orderitems)
{
if (orderitems != null)
{
Order order = new Order();
order.OrderItems = orderitems.ToList<OrderItem>();
return order;
}
return null;
}
}
不确定为什么要回显数据但将其转换为列表会将其发回。
提琴手请求:
POST http://localhost:64719/api/Order HTTP/1.1 User-Agent: Fiddler Content-Type: application/json Host: localhost:64719 Content-Length: 615
[ {
"ID": 1,
"Manufacturer": "sample string 2",
"PartNumber": "sample string 3",
"Description": "sample string 4",
"Price": 5.0,
"Quantity": 6,
"TotalPrice": 7.0 }, {
"ID": 1,
"Manufacturer": "sample string 2",
"PartNumber": "sample string 3",
"Description": "sample string 4",
"Price": 5.0,
"Quantity": 6,
"TotalPrice": 7.0 }, {
"ID": 1,
"Manufacturer": "sample string 2",
"PartNumber": "sample string 3",
"Description": "sample string 4",
"Price": 5.0,
"Quantity": 6,
"TotalPrice": 7.0 } ]
提琴手回应:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcV29ya1xFSVAgV29ya1xRdWVzdGlvbnNcU2FtcGxlTVZDXFNhbXBsZU1WQ1xhcGlcT3JkZXI=?=
X-Powered-By: ASP.NET
Date: Wed, 24 Jun 2015 20:09:38 GMT
Content-Length: 464
{"ID":0,"OrderItems":[{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0},{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0},{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0}]}
更新1
我没有ajax设置和安装,但这是我的java脚本。我认为您需要删除JSON.stringify调用周围的字符串以仅传递ogject。
var TestXmlhttp = new XMLHttpRequest();
TestXmlhttp.open("POST", "http://localhost:64719/api/Order", true);
TestXmlhttp.setRequestHeader("Content-Type", "application/json");
TestXmlhttp.onreadystatechange = function () {
if (TestXmlhttp != null) {
if (TestXmlhttp.readyState == 4) {
try {
alert("Good");
}
catch (e) {
alert("Bad");
}
}
else {
}
}
}
TestXmlhttp.send(JSON.stringify(OrderItems));