2012-02-13 102 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