Asp.Net MVC 3 JSON模型绑定无法正常工作

时间:2012-02-13 12:35:25

标签: json asp.net-mvc-3 model-binding

我正在使用MVC3并且我知道MVC3支持将JSON文字绑定到Action参数。但我不能成功地做到这一点;

我有一个班级名称Tag

public class Tag
{
    public int tagId { get; set; }
    public string tagName { get; set; }
}

控制器上的一个名为Tag

的动作
    [HttpPost]
    public ActionResult Tag(Tag tag)
    {
        // Here will be codes...
        return Json(new { success = 0 });
    }

将js对象作为JSON发送到我的操作的Javascript代码

    var tag ={tagId:5,tagName:"hello"};
    $.ajax({
           url: "/image/tag",
           type: "POST",
           data: $.toJSON(tag),
           success: function (r) {
               if (r.success == 1) {
                   window.location = r.redirect;
               }
           }

我在Firebug Net标签中看到的发布数据

{"tagId":5,"tagName":"hello"}

Tag Action中的参数名称标记不为null,但tagId的值为O,tagName的值为null。 这里有什么问题?

1 个答案:

答案 0 :(得分:18)

您需要将请求的内容类型设置为application/json

$.ajax({
    url: '/image/tag',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(tag),
    success: function (r) {
        if (r.success == 1) {
            window.location.href = r.redirect;
        }
    }
});

啊,你不需要让你的Tag模型属性以小写字母开头:

public class Tag
{
    public int TagId { get; set; }
    public string TagName { get; set; }
}

备注1:ASP.NET MVC 3在幕后使用的JavaScriptSerializer类能够正确处理它。

备注2:在您的Tag操作中,您似乎正在返回以下JSON:{"success":0}而在您成功的AJAX回调中,您似乎使用了一些r.redirect属性存在。

备注3:避免以与视图模型相同的方式命名控制器操作。通常,操作名称应代表动词(如ListSaveDelete,...),而视图模型代表资源(TagModel,...)。