JSON Post Request不适用于ASP.NET5 MVC,但适用于ASP.NET4.5 MVC



我有一个向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脚本附加到它的点击事件中。

    <p><button id="saveButton">Save</button></p>
    

这是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. 我在控制器中设置了调试断点,并验证即将到来的post请求。在ASP.NET 4.5中,JSON反序列化正在工作,它显示了所有值。

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

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

请查看以下屏幕截图:http://i63.tinypic.com/68vwnb.jpg

我错过什么了吗?感谢您的帮助…

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

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

我认为您需要特别注意控制器中的Body。

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

感谢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"不是问题。有了它,剧本仍然有效。

实际上,这个问题是我原来问题的简化版。我最初的问题是从击倒Js开始。下面是执行数据绑定的脚本。用户点击"保存"按钮后,self.Save函数()被调用,脚本会将包含数据模型的post请求发送到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"开始的所有数据都是特定于KnockoutJ的。我需要手动修剪这些数据吗?根据信息,显然同样的实现应该在ASP.NET 4.5中工作,但我只是还没有尝试过。非常感谢。。。

最新更新