通过Ajax发布表单数据导致Null模型数据

时间:2014-10-27 17:23:33

标签: c# ajax model-view-controller fluentvalidation

我试图通过Ajax请求发布模板绑定到控制器的表单数据,但是,尽管请求标头显示正在发送数据,但控制器显示数据为空。

代码如下。我尝试过数据:JSON.stringify(form)导致null模型,而下面导致一个带有null数据的模型。

查看

$(document).on('click', '#saveData', function () {
                    if ($('#form').valid()) {
                        var form = $('#form').serialize();
                        $.ajax(
                            {
                                url: '@Url.Action("CreateClient", "Processors")',
                                type: 'POST',
                                cache: false,
                                async: false,
                                dataType: 'json',
                                contentType: 'application/json',
                                data: JSON.stringify(form)
                        })
                            .success(function (response) 
{ alert(response); })
                            .error(function (response) 
{ alert(response); });
                    }
                });

控制器

public ActionResult CreateClient(ModelData form)
    {
        if (form == null || !ModelState.IsValid)
        {                
            return Json("Error");
        }

        return Json("Success");

    }

1 个答案:

答案 0 :(得分:2)

您的方法存在两个问题。

如果您的模型类ModelData是,例如

class ModelData {
    public string Foo {get;set;}
    public string Bar {get;set;}
}

要发送的相应数据为{foo:"foo1", bar:"bar1"},或最终为{Foo:"foo1", Bar: "bar1"},具体取决于您如何配置序列化 - 因为您已指定contentType 'application/json'

但是,您正在使用jquery serialize()阅读表单。此方法返回"foo=foo1&bar=bar1"表单上的字符串,该字符串适用于contentType 'application/x-www-form-urlencoded'。因此,您必须决定以何种格式发送数据。如果您想继续使用serialize()从DOM获取数据,请改用'application/x-www-form-urlencoded'

其次,JSON。stringify()将从对象创建一个JSON字符串。字符串也是一个对象。因此,将字符串传递给此函数会将字符串包装在字符串中,这没有多大意义:数据类似于"\"foo=foo1&bar=bar1\""。以同样的方式,当contentType为'json'时,jQuery ajax函数将期望一个对象为它的数据参数,因此如果您之前将对象转换为字符串,它将被发送为:字符串。基本上,无论您最终为您的请求选择contentType,都不要将JSON.stringify用于您的数据参数。

TL; DR:要使其正常工作,请使用默认的contentType或按照以下方式明确声明它,并按原样传递表单变量:

var form = $('#form').serialize();
$.ajax(
   {
       //(...)
       contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
       data: form,
       //(...)