我试图通过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");
}
答案 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,
//(...)