将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败

Posted

技术标签:

【中文标题】将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败【英文标题】:AJax Call that pass KnockoutJS Observable Array to the HTTP Post Controller Method fails 【发布时间】:2021-07-24 22:43:30 【问题描述】:

我正在尝试对 Http Controller POST 方法进行 Ajax 调用,从 ajax 传递到 Controller 的数据是 JSON 数组,它是来自 KnockoutJS 的 ObserverableArray。对 HTTP 控制器的 AAX 调用如下所示

 $.ajax(
                    url: '/ORF/pdtInfo',
                    type: 'POST',
                    data: ko.toJSON(self.pdtDetails()),
                    success: function (result) 
                        console.log("OrderRequest - Recorded inserted Sucessfully" );
                    ,
                    error: function (errorThrown) 
                        console.log("OrderRequest - Recorded insert Failed" +errorThrown.responseText );
                        callHandleUserError("Request Failed");
                    
                )

ko.toJSON(self.pdtDetails()), 传递给 Controller 的数据是这样的

["pdtNeededTypes":["Individual","Other"],
  "stockNumber":"0054654354  |  y8fdts-Tg(hhhjhj)2Mnn/J          [Also Known as : O2 , OygR4-EhaFP]",
  "pdtNeeded":"Other",
  "pdtTypes":""]

Controller 方法如下,接收数组作为输入参数

   public JsonResult pdtInfo(List<Models.ORFPdtInfo> orfpdtInfo)
    
        try
        
            if (Session["ORFData"] != null)
            
                ORFData ORFData = Session["ORFData"] as ORFData;
                ORFData.pdtInfo = orfpdtInfo;
                Session["ORFData"] = ORFData;
                var result = new JsonResult()
                
                    Data = orfpdtInfo,
                    MaxJsonLength = Int32.MaxValue
                ;
                return result;
            
            else
            
                return Json(new  redirectUrl = Url.Action("Index", "ORF"), isRedirect = true );
            
        
        catch (Exception e)
        
            return null;
        
    

模型类 ORFPdtInfo 的所在

public class ORFPdtInfo

    public List<string> pdtNeededTypes  get; set; 
    public string stockNumber  get; set; 
    public string pdtNeeded  get; set; 
    public string pdtTypes  get; set; 

ORFData 是我编写电子邮件内容的类,我从控制器将数据传递给该类以编写电子邮件正文内容

[Serializable]
public class ORFData

public List<ORFPdtInfo> pdtInfo  get; set; 

public string SerializedOrderData()

    StringBuilder orderText = new StringBuilder();
    for (int i=0;i<pdtInfo.Count();i++ )
    orderText.AppendLine("<tr><td width='30%'>Pdt Needed </td><td width='70%'>" + pdtInfo[i].pdtNeeded + "</td></tr>");
    .... 

问题是当对 Controller 方法的 Ajax 调用自动转到错误函数时。我试图通过将它们放在控制台errorThrown.responseText 中来查看错误,但它是空的。我还在控制器中设置断点List&lt;Models.ORFPdtInfo&gt; orfpdtInfo 为空,ajax 调用没有将任何内容传递给控制器​​,我是否缺少模型类绑定的任何内容。非常感谢任何帮助

【问题讨论】:

如果你在 Controller Action 中的 catch (Exception e) 块内设置断点,它会命中吗? @CallumMorrisson 控制器中的 Catch 块没有命中,而只是 AJAX 调用 `error: function (errorThrown)` 返回什么状态码? @CallumMorrisson 状态码在哪里出现 AJAX 错误? 也许这会有所帮助:***.com/questions/6186770/… 【参考方案1】:

contentType: "application/json",添加到 POST 方法 AJAX 调用修复了该问题

【讨论】:

以上是关于将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败的主要内容,如果未能解决你的问题,请参考以下文章

KnockoutJS:模板未在可观察数组更改时更新(仅在添加时,在删除时有效)

使用可观察数组进行 Knockoutjs 映射和验证

KnockoutJS - 可观察对象的可观察数组,包含来自 SQL 服务器的数据

Knockoutjs:如何使添加到列表中的输入值也可观察

可观察到的数组更改不会反映在第一次点击 - KnockoutJS

Knockout JS,如何在更改可观察数组中的值时更改样式属性