从核心/淘汰赛中的 POST 操作返回 Json 数据

Posted

技术标签:

【中文标题】从核心/淘汰赛中的 POST 操作返回 Json 数据【英文标题】:Return Json data from POST action in Core/knockout 【发布时间】:2018-07-28 06:52:55 【问题描述】:

我正在使用 .NET Core 中的 Knockout javascript 库。我有以下 POST 操作,可以从我的视图中成功接收和处理 Json 数据。我不能上班的是给客户的回报:

1) 理想情况下,我希望它将更新后的内容返回到视图中。但是,这个 .NET Core 似乎有问题,这意味着映射不起作用。以下都不起作用:

        return Json(JsonConvert.SerializeObject(salesOrderViewModel));
        return Json(salesOrderViewModel);
        return Json( new  salesOrderViewModel );

2) 但其他回报似乎也没有任何效果。例如:

        //return NotFound();
        //return RedirectToAction("Index");
        //return View("Index");
        //return DoSomething();
    

    private IActionResult DoSomething()
    
        return RedirectToAction("Index", "Bird");
    

下面我粘贴了视图、客户端视图模型和完整的控制器操作。谁能告诉我为什么我不能从我的控制器操作中返回任何东西?

查看:

@model Birder2.ViewModels.SalesOrderViewModel
@using Newtonsoft.Json
@
    ViewBag.Title = "Sales Order Details";

@
string data = JsonConvert.SerializeObject(Model);

@section scripts
<script src="~/js/knockout-3.4.2.js"></script>
<script src="~/js/knockout.mapping-latest.js"></script>
<script src="~/js/salesorderviewmodel.js"></script>
<script type="text/javascript">
    var salesOrderViewModel = new SalesOrderViewModel(@html.Raw(data));
    ko.applyBindings(salesOrderViewModel);
</script>

<p data-bind="text: MessageToClient"></p>
<div>
    <div>
        <label>Customer Name:</label>
        <input data-bind="value: CustomerName" />
    </div>
       <div>
        <label>P.O. Number:</label>
        <input data-bind="value: PONumber" />
   </div>
</div>
<p><button data-bind="click: save">Save</button></p>

客户端视图模型:

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

    self.save = function () 
        $.ajax(
            url: "/SalesOrders/Save/",
            type: "POST",
            data: ko.toJSON(self),
            headers:
            
                "content-type": "application/json; charset=utf-8"
            ,
            success: function (data) 
                if (data.salesOrderViewModel)
                    ko.mapping.fromJS(data.salesOrderViewModel, , self);
            ,
        );
    ;
;

完整的控制器动作在这里:

    //[HttpPost]
    //public JsonResult Save([FromBody]SalesOrderViewModel salesOrderViewModel)
    [HttpPost]
    public IActionResult Save([FromBody]SalesOrderViewModel salesOrderViewModel)
     
        SalesOrder salesOrder = new SalesOrder();
        salesOrder.CustomerName = salesOrderViewModel.CustomerName;
        salesOrder.PONumber = salesOrderViewModel.PONumber;

        _context.SalesOrders.Add(salesOrder);
        _context.SaveChanges();

        salesOrderViewModel.MessageToClient = string.Format("0’s sales order has been added to the database.", salesOrder.CustomerName);

        return Json(JsonConvert.SerializeObject(salesOrderViewModel));
        //return Json(salesOrderViewModel);
        //return Json( new  salesOrderViewModel );

        //return NotFound();
        //return RedirectToAction("Index");
        //return View("Index");
        //return DoSomething();
    

数据绑定成功,数据库更新)。没有任何东西返回给客户端。

【问题讨论】:

您在使用返回类型作为 JsonResult 时是否发现任何问题? @G_S 完全相同的行为,恐怕。 return Json(salesOrderViewModel);应该工作。 不幸的是我也试过了。我又试了一次,返回类型为 IActionResult,再次使用 JsonResult 返回类型。两者都不起作用。 即使我忘记将 Json 返回视图,似乎也没有返回工作。例如,简单的重定向回索引不起作用:return View('Index'); 【参考方案1】:

对 View 进行了更改,以便我们正确绑定淘汰赛并在成功方法中使用正确的对象。

【讨论】:

以上是关于从核心/淘汰赛中的 POST 操作返回 Json 数据的主要内容,如果未能解决你的问题,请参考以下文章

必须将视频从 JSON 对象加载到 div 中,这可以通过淘汰赛来完成吗?

怎么获取AJAX前台返回JSON 数据

ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型

发生错误 400(错误请求)时,使用 Axios 从 POST 捕获返回 json

Java后端发出post请求带参数并接收返回的json

Knockoutjs 选项与 JSON 数据绑定?