【发布时间】:2015-06-24 17:29:36
【问题描述】:
我已经在这个问题上讨论了一整天,我已经阅读了一个又一个帖子,但我仍然卡住了。我正在尝试为我们的网络部门开发一个 Intranet 服务目录。我希望能够将一组 JSON 对象发送到服务器,每个对象都是订单中的一个项目。我很乐意用 MVC 或 Web API 控制器来做这件事。到目前为止,它主要是一个 MVC 项目。
我的 ajax 调用:
$.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!");
}
});
我生成的 JSON 请求(来自 Fiddler)
{
"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"
}
]
}
订单类:
public class Order
{
public int ID { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
OrderItem 类:
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; }
}
我尝试构建 MVC 和 Web Api 2 控制器以在数据库中获取此信息。我的 MVC 控制器总是将 ObjectItem JSON 视为 null,并且 Web Api 2 控制器无法将数组转换为列表。我现在脑子坏了。
如果有人能告诉我创建我正在寻找的控制器的方法,我将不胜感激。
编辑
目前我正在使用自动生成的 Web API 2 控制器
// 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);
}
编辑 2
下面是一个基于 Immersive 提示的 MVC 控制器。我构建了一些 JSON 响应,因此我可以尝试查看发生了什么。 ModelState 无效,所以我返回了最后一个返回响应,它显示了一个空数组。这基本上与我尝试过的任何 MVC 控制器遇到的问题相同:它们都没有对传入的 JSON 数据做任何事情。
编辑 3
根据 Immersive 的提示,我对 API 控制器进行了一些操作。这会回避无法反序列化数组的错误,因为它需要一个 JSON 数组……我不知道为什么我的不符合条件。
[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);
}
编辑 4
这是一个基于 Thufir 输入的 MVC 控制器,但模型状态总是显示无效。我的 JSON 在 JSONlint 签出。我使用经过验证的“漂亮”版本 JSONlint 更新了上面的示例。
[HttpPost]
public ActionResult Create(Order model)
{
if (ModelState.IsValid)
{
db.Orders.Add(model);
db.SaveChanges();
// return RedirectToAction("Index");
return Json("Valid!");
}
return Json("Was not valid");
// return View(model);
}
【问题讨论】:
-
你能展示一下你当前的控制器是什么样子的吗?
-
会不会是您的 JSON 请求直接生成
OrderItems,但您的 MVC 需要一个Order对象?尝试请求一个完全成熟的Order,或者将Action 的参数类型更改为List<OrderItem>(特别是PostOrder(List<OrderItem> OrderItems))... 猜测一下=) -
Wep API 如果您只是尝试将项目列表推送到数据库而不使用 MVC 的正常 POST 行为,则可以使用 jQuery 的 .each() 之类的东西,并将项目传递给一次使用 ajax 到控制器中的方法只是为了绑定它们。这不是最有效的方法,但可以尝试看看是否还有其他问题。 (这是不知道 UI 的样子或屏幕的作用)。
-
@Matt West 你如何生成你的 json 请求??
-
Feras - 它是一个数组,是前端生成的 JavaScript 对象的一部分。我 JSON.stringify 数组,然后将它提供给我在原始问题中的 ajax 请求。输出就是你在那里看到的。
标签: c# json asp.net-mvc asp.net-web-api2