2012-02-13 100 views
7

我使用的是MVC3,我知道MVC3支持绑定JSON文本到Action参数。但我无法成功地做到这一点;Asp.Net MVC 3 JSON模型绑定不起作用

我有一个类名标签

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

称为标签上的控制器的动作

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

JavaScript代码,送JS对象的JSON我的行动

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"} 

标记操作中的参数名称标记不为空,但其值为tagId,null为tagName。 这里有什么问题?

回答

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; 
     } 
    } 
}); 

啊,而且你不需要有你的标签模特属性开始用小写字母:

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:避免以与视图模型相同的方式命名控制器操作。通常动作名称应代表动词(如List,Save,Delete,...),而视图模型表示资源(TagModel,...)。

+1

标记既是名词又是动词 – 2012-02-13 12:49:20

+0

感谢达林,我面对这个问题约1小时你救了我。另外感谢您的额外信息 – Yucel 2012-02-13 12:49:51

+0

备注2.响应中的成功= 0,以便块不会评估 – 2012-02-13 12:50:48