2014-01-29 74 views
0

我一直在使用Web API,發現了一個有趣的觀察,我無法理解。爲什麼ModelBinding不能與FormData一起使用,但可以與RequestPayload一起使用?

控制器:

 
public class UserController: ApiController 
{ 
    public void Post(MyViewModel data) 
    { 
     //data is null here if pass in FormData but available if its sent through Request Payload 
    } 
} 

視圖模型

 
public class MyViewModel{ 
     public long SenderId { get; set; } 
     public string MessageText { get; set; }  
     public long[] Receivers { get; set; } 
} 

JS不工作

 
var usr = {}; 
usr.SenderId = "10"; 
usr.MessageText = "test message"; 
usr.Receivers = new Array(); 
usr.Receivers.push("4"); 
usr.Receivers.push("5"); 
usr.Receivers.push("6"); 

$.ajax(
{ 
    url: '/api/User', 
    type: 'POST', 
    data: JSON.stringify(usr), 
    success: function(response) { debugger; }, 
    error: function(error) {debugger;} 
}); 

JS是工作

 
var usr = {}; 
usr.SenderId = "10"; 
usr.MessageText = "test message"; 
usr.Receivers = new Array(); 
usr.Receivers.push("4"); 
usr.Receivers.push("5"); 
usr.Receivers.push("6"); 

$.post("/api/User", usr) 
.done(function(data) { 
debugger; 
});

因此,如果我傳遞$.ajax與其他很多配置如type,contentType,accept等,它仍然沒有正確綁定模型,但在$.post的情況下它的工作原理。

任何人都可以解釋爲什麼?

+0

什麼是基於請求,並在'$ .post'的情況下,你看到在'$ .ajax'情況下,內容類型?請注意,內容類型對web api非常重要,因爲它嘗試使用基於此的正確格式化程序來反序列化請求內容。 –

+0

內容類型是application \ json,我想知道它爲什麼適用於請求負載而不適用於表單數據。 –

回答

0

嘗試尋找什麼被貼的時候你(使用Fiddler例如您選擇的F12工具)與$.ajax嘗試。很可能是因爲jQuery將數據作爲URL編碼字符串傳遞,而不是像JSON文本那樣傳遞數據。

要解決此問題嘗試contentType參數指定dataType在一起。另外,我不認爲你需要JSON.stringify,只是通過JSON文字你創建:

$.ajax({ 
    data: usr, 
    dataType: 'json', 
    contentType: 'application/json', 
    /* The rest of your configuration. */ 
}); 

下面是我們在我們的項目之一使用打字稿方法(ko.toJSON返回表示JSON字符串文字傳遞作爲方法參數):

public static callApi(url: string, type?: string, data?: any): RSVP.Promise { 
    return new RSVP.Promise((resolve, reject) => { 
     $.ajax('/api/' + url, { 
      type: type || 'get', 
      data: data != null ? ko.toJSON(data) : null, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success:() => { 
       resolve.apply(this, arguments); 
      }, 
      error:() => { 
       reject.apply(this, arguments); 
      } 
     }); 
    }); 
} 

希望這會有所幫助。

+0

我已經做到了。當你通過它通過$就不言而喻申請表數據部分,但是當你把它傳遞到$。員額它去請求有效載荷部分 –

+0

@PrashantLakhlani不知道你的意思,但只是比較二個原始POST請求,你會立即看到差異。另外,我不認爲你需要'JSON.stringify',只是傳遞你創建的JSON文字。 – volpav

相關問題