MVC 3尝试将JSON对象从视图发送到模型

时间:2012-04-05 11:45:10

标签: json asp.net-mvc-3 jquery

我正在尝试将一个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;}

    }

这是来自提琴手的要求 - 我突出了我不确定的部分:

enter image description here

我认为内容类型是“application / json”,并且数据看起来不像查询字符串 - 我认为它看起来像这样:

{
    Name: "James",
    Age: 13
}

最终问题是,如果我在控制器操作中粘贴一个断点,我希望看到一个填充的Person对象,但它总是为null。如果我将签名替换为(object name, object age),那么我得到参数的值(两者的字符串数组 - 所以name是一个字符串数组,其中1个元素等于“James”)。

我出错的任何想法?

哦,仅仅是因为,我实际上不是13岁!这是我捣碎的第一批数字。

谢谢!

詹姆斯

2 个答案:

答案 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'