Ajax POST和Stringify混淆

时间:2017-07-12 17:43:56

标签: javascript jquery ajax asp.net-mvc

我正在学习使用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的值是我在stringify之前看到的大多数示例,例如示例here

一旦采用这种格式,这就是大多数响应的时候,例子仍然会调用stringify。

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

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

2 个答案:

答案 0 :(得分:1)

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

    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()
{

}

答案 1 :(得分:1)

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

public class DataViewModel
{
    public DataViewModel()
    {

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