我正在尝试将一个JSON对象从我的视图发布到MVC 3应用程序中的控制器,我希望请求中的数据绑定到我的控制器操作的模型参数。但是,当我检查HTTP POST请求时,看起来数据作为查询字符串传递,我不确定为什么(对所有这些都很新)。
这是我的POST请求:
$.ajax({
type: 'POST',
url: "Test/Add",
data: { Name: name, Age: age },
success: function (data) {
console.log("success");
},
error: function (xhr, data, message) {
console.log(data + ": " + message);
},
dataType: "json"
});
这是我的Controller中的代码,后面是我试图绑定到的模型的代码:
[HttpPost]
public ActionResult Add(PersonModel person)
{
System.Threading.Thread.Sleep(1000);
return View();
}
// person model:
public class Person {
public string Name {get;set;}
public int Age {get;set;}
}
这是来自提琴手的要求 - 我突出了我不确定的部分:
我认为内容类型是“application / json”,并且数据看起来不像查询字符串 - 我认为它看起来像这样:
{
Name: "James",
Age: 13
}
最终问题是,如果我在控制器操作中粘贴一个断点,我希望看到一个填充的Person对象,但它总是为null。如果我将签名替换为(object name, object age)
,那么我得到参数的值(两者的字符串数组 - 所以name是一个字符串数组,其中1个元素等于“James”)。
我出错的任何想法?
哦,仅仅是因为,我实际上不是13岁!这是我捣碎的第一批数字。
谢谢!
詹姆斯
答案 0 :(得分:2)
@David是正确的,因为您需要将contentType设置为'application / json'。但是你还需要发送JSON。你正在发送一个对象。要将其转换为JSON,请使用JSON.stringify。我尝试将其作为具有此contentType设置的对象发送并收到服务器错误。我实际上没有设置contentType就可以正常工作。即使请求被称为“Name = James& Age = 13”,MVC也能够将其转换为对象。我修改了你的测试以将结果回显为JSON并显示它们。
这是修改后的Controller
[HttpPost]
public string Add(PersonModel person)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string result = serializer.Serialize(person);
return result;
}
// person model:
public class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
}
修改后的Javascript和HTML如下所示:
<input id="doAjax" type="button" value="Send Json..."/>
<br />
Results:<br />
<textarea id="results" cols="30" rows="3"></textarea>
<script type="text/javascript">
$( document ).ready( function () {
$( "#doAjax" ).click( sendJson );
} );
function sendJson() {
var name = "James";
var age = "13";
var person = { Name: name, Age: age };
var personJson = JSON.stringify( person );
$.ajax( {
type: 'POST',
url: "Test/Add",
data: personJson,
contentType: 'application/json',
success: function ( data ) {
var jsonStr = JSON.stringify( data );
$( "#results" ).val( jsonStr );
},
error: function ( xhr, data, message ) {
var jsonStr = JSON.stringify( data );
$( "#results" ).val( jsonStr + ": " + message );
},
dataType: "json"
} );
}
以下是一些测试的结果:
data = person; contentType =未设置; request =“Name = James&amp; Age = 13”; response =“{”姓名“:”詹姆斯“,”年龄“:13}”
data = personJson; contentType =未设置; request =“{”Name“:”James“,”Age“:”13“}”; response =“{”Name“:null,”Age“:0}”
data = person; contentType ='application / json'; request =“Name = James&amp; Age = 13”; response =“System.ArgumentException:无效的JSON原语:名称”
data = personJson; contentType ='application / json'; request =“{”Name“:”James“,”Age“:”13“}”; response =“{”姓名“:”詹姆斯“,”年龄“:”13“}”
请注意,如果未设置contentType,则默认为“application / x-www-form-urlencoded”
答案 1 :(得分:1)
传递给dataType
的{{1}}是预期的响应类型。您需要添加$.ajax
以指定有效内容类型。
contentType
$.ajax({
type: 'POST',
url: "Test/Add",
data: { Name: name, Age: age },
contentType: 'application/json' //*********
success: function (data) {
console.log("success");
},
error: function (xhr, data, message) {
console.log(data + ": " + message);
},
dataType: "json"
});
的{{3}}表示默认的contentType为'application / x-www-form-urlencoded'