【问题标题】:Ajax POST and Stringify ConfusionAjax POST 和 Stringify 混淆
【发布时间】:2017-12-17 06:38:51
【问题描述】:

我正在学习使用 Ajax 进行 POST,我注意到很多在静态数组上使用 stringify 的示例。

在我的示例中,我通过从 <input> 值中提取的 jQuery 对象构建数组。

jQuery

​​>
    function PostEdit(vData){
        var content = JSON.stringify(vData); //content = "[{"Id":"1","Date":"7/12/2017 12:00:00 AM"}]"

            $.ajax({
                url: '@Url.Action("Index", "PostViewData")',
                type: "POST",
                data: JSON.stringify({ ViewData : vData }),
                contentType: "application/json",
                success: function (result) {
                    alert("success" + result);
                },
                error: function (result) {
                    alert("failure" + result);
                }
        });
        return;
    }

控制器

    [HttpPost]
    public ActionResult Index(List<DataViewModel> ViewData )
    {
        if(ViewData != null)
        {
            var json = new { success = true };
            return Json(json);
        }
        return Json(false);
    }

视图模型

public class DataViewModel
{
    public DataViewModel(string id, string date)
    {
        Id = id;
        Date = date;
    }
    public string Id { get; set; }
    public string Date { get; set; }
}

其中DataViewModel 是一个由两个值组成的类,IdDate,它们对应于我的 JS 对象。

由于vData作为值vData = [Object]进入函数,当我调用.stringify(vData)时它返回content = "[{"Id":"1","Date":"7/12/2017 12:00:00 AM"}]"

上面content 的值是我看到的大多数示例在字符串化之前的结构,例如示例here

一旦采用这种格式,这是大多数响应的时候,示例无论如何都会调用 stringify。

现在当我打电话给.stringify(ViewData : vData) 时,我什至连控制器都没有。 Ajax 无法发布。相反,当我调用.stringify(ViewData : content) 时,我将其发送到控制器,但值为空。我错过了什么/误解了什么?

我正在寻找关于 Ajax Post 和 Stringify 以及它如何与控制器参数交互的更好解释。

【问题讨论】:

  • 你试过“数据:vData”吗?
  • 像这样传递var myArray = new Array(); myArray = {"Id":"1","Date":"7/12/2017 12:00:00 AM"}; var myData = { ViewData : myArray }; 然后在你的ajax data:myData,就是这样!
  • 什么是DataViewModel
  • @Musa DataViewModel 是一个由两个值组成的类,IdDate 对应于我的 JS 对象。
  • @HenriqueOeckslerBertoldi 是的

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

只需将无参数构造函数添加到您的模型。通过该更改,您的代码将按原样工作。 ASP 无法将您的 json 解析为 DataViewModel,因为它试图调用不存在的默认构造函数。

public class DataViewModel
{
    public DataViewModel()
    {

    }
    //...other methods and members here
}

【讨论】:

  • 这是可行的解决方案。有什么办法可以通过调试找到这个吗?
  • 你不会看到 VS 中抛出的异常,因为它发生在 action 方法中的代码运行之前。我总是在浏览器检查器工具中检查网络选项卡。它返回默认错误页面,而不是 json 响应。总的来说,我在各种情况下都遇到过这个错误信息。每当您有一个带参数的构造函数时,如果要调用它,您就必须创建一个无参数构造函数。但是,如果该类没有任何构造函数,那么您仍然可以在不传递参数的情况下创建实例。
【解决方案2】:

请尝试以下解决方案。
还有另一种方法

    function PostEdit(vId, vDate){

        $.ajax({
            url: '/PostViewData/Index' // it should be '/controller/method'
            type: "POST",
            data: JSON.stringify({ Id: vId, Date: vDate}),  
            contentType: "application/json",
            success: function (result) {
                alert("success" + result);
            },
            error: function (result) {
                alert("failure" + result);
            }
    });
    return;
}


[HttpPost]
public ActionResult Index(string Id, string Date )
{
    if(Id != null)
    {
        var json = new { success = true };
        return Json(json);
    }
    return Json(false);
}

更新:在控制器方法中,应该是字符串id,字符串日期
更新:构造函数应该是无参数的。从下面提到的答案

public DataViewModel()
{

}

【讨论】:

  • 我以 stringify 为例,主要是为了表明数据确实存在,我可以在任何地方进行 stringify。我通常更喜欢在ajax内部做。我只是想显示数据在 vData 开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2016-09-25
  • 1970-01-01
  • 2015-10-13
  • 2011-09-22
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多