JSON Post Request在ASP.NET5 MVC中不起作用,但在ASP.NET4.5 MVC中工作

时间:2016-04-08 01:51:58

标签: asp.net json asp.net-mvc asp.net-mvc-4

我有一个向MVC控制器发送JSON post请求的示例。此示例适用于ASP.NET 4.5,但不适用于最新的ASP.NET 5版本。我在这个例子中是否遗漏了什么?

  1. 我创建了一个模型,但是我没有将它绑定到数据库。它将只是在内存中创建的对象。

    public class SalesOrder
    {
        public int SalesOrderId { get; set; }
        public string CustomerName { get; set; }
        public string PONumber { get; set; }
    }
    
  2. 我使用Visual Studio 2015创建基于模型的控制器及其关联的CRUD视图。但是,在此示例中,我只会运行“创建”视图。

  3. 在控制器内部,我对SalesOrder对象列表进行了硬编码,它只包含一个项目。我将使用它来处理CRUD视图。

    private List<SalesOrder> salesOrderList = 
        new List<SalesOrder> ( 
            new SalesOrder[] 
            { 
                new SalesOrder() 
                    { 
                         SalesOrderId = 1, 
                         CustomerName = "David", 
                         PONumber = "123" 
                    } 
            });
    
  4. 在控制器内部,我还创建了一个新函数来处理“保存”请求。该请求只会更改模型的CustomerName属性,然后使用JSON结果退回。

    [HttpPost]
    public JsonResult Save(SalesOrder salesOrderViewModel)
    {
        salesOrderViewModel.CustomerName = "David returns";
    
        return Json(new { salesOrderViewModel });
    }
    
  5. 在Create.cshtml中,我创建了一个按钮并将JQuery脚本附加到其click事件中。

    <p><button id="saveButton">Save</button></p>
    
  6. 这是JQueryScript。

        $(function () {
            var clickFunc = function () {
    
                var salesOrderViewModel = {
                        "salesOrderViewModel": {
                        "SalesOrderId": 123,
                        "CustomerName": "ab",
                        "PONumber": "2",
                        }
                }
    
                $.ajax({
                        url: "/SalesOrders/Save/",
                        type: "POST",
                        cache: false,
                        data: JSON.stringify(salesOrderViewModel),
                        contentType: "application/json; charset=utf-8"
                    });
                }
    
            $('#saveButton').click(clickFunc)
        })
    
    1. 我点击Create.cshtml中的“保存”按钮以触发发布请求。

    2. 我在控制器中设置调试断点并验证即将发布的请求。在ASP.NET 4.5中,JSON反序列化正在运行,它显示了所有值。

    3. 但是,在ASP.NET 5中,返回一个空对象。

      在ASP.NET 5的情况下,如果按F12在Microsoft Edge中启动调试器,则表明Post请求确实具有正确的值,但由于某些原因,它们不会传递给MVC控制器。

      请看这些屏幕截图: http://i63.tinypic.com/68vwnb.jpg

      我错过了什么吗? 谢谢你的帮助...

3 个答案:

答案 0 :(得分:0)

我认为您不需要指定参数的名称。试试:

           var salesOrderViewModel = {
                    "SalesOrderId": 123,
                    "CustomerName": "ab",
                    "PONumber": "2",
            }

答案 1 :(得分:0)

我认为您需要在控制器中指定fromBody。

[HttpPost]
public JsonResult Save([FromBody]SalesOrder salesOrderViewModel)
{
    salesOrderViewModel.CustomerName = "David returns";

    return Json(new { salesOrderViewModel });
}

答案 2 :(得分:0)

感谢DCruz22和Stephen Muecke。 该脚本的工作版本是:

$(function () {

    var clickFunc = function () {

        var salesOrderViewModel = {
            "salesOrderViewModel": {
                "SalesOrderId": 0,
                "CustomerName": "ab",
                "PONumber": "2",
                "MessageToClient": "POST to server"
            }
        }

        $.ajax({
            url: "/SalesOrders/Save/",
            type: "POST",
            cache: false,
            data: salesOrderViewModel
        });
    }

    $('#saveButton').click(clickFunc)
})

我发现参数名称“salesOrderViewModel”不是问题。有了它,脚本仍然有效。

实际上,这个问题是我原始问题的简化版本。我最初的问题是从淘汰赛开始。下面是执行数据绑定的脚本。用户单击“保存”按钮后,将调用self.save函数(),脚本会将包含数据模型的发布请求发送到MVC控制器。

SalesOrderViewModel = function (data) {
    var self = this;
    ko.mapping.fromJS(data, {}, self);

    self.save = function () {
        $.ajax({
            url: "/SalesOrders/Save/",
            type: "POST",
            cache: false,

            data: ko.toJSON(self),

            success: function (data) {

            }
        });
    }
}

问题是“ko.toJSON(self)”包含一些其他信息。下面是我从Microsoft Edge调试器中捕获的请求正文。

{"SalesOrderId":0, 
 "CustomerName":"chiang123", 
 "PONumber":"123", 
 "MessageToClient":null, 
 "__ko_mapping__":{
       "ignore":[],
       "include":["_destroy"],
       "copy":[],
       "mappedProperties":{
             "SalesOrderId":true,
             "CustomerName":true,
             "PONumber":true,
             "MessageToClient":true}}}

您可以看到从“ ko_mapping ”开始的所有数据都是KnockoutJs特有的。我是否需要手动修剪这些数据才能使其正常工作?根据信息,显然相同的实现应该在ASP.NET 4.5中起作用,但我还没有尝试过。非常感谢......