2014-11-03 52 views
1

我從這個方法接收JSON數據:MVC參數從JSON綁定到多個參數

function CallAPI(controllerName, functionName, sendData, callback) { 
    var ajax = new XMLHttpRequest(); 
    ajax.onreadystatechange = function() { 
     if (ajax.readyState == 4) { 
      if (ajax.status == 200) { 
       var response = JSON.parse(ajax.responseText); 
       callback(response); 
      } 
      else { 
       callback(); 
      } 
     } 
    } 
    ajax.open("POST", "http://" + window.location.host + "/API/" + controllerName + "/" + functionName, true); 
    ajax.setRequestHeader('Content-Type', 'application/json'); 
    ajax.send(JSON.stringify(sendData)); 
} 

function someRequest() { 
    var data = {}; 
    data.userID = 1; 
    data.someValue = 20; 
    CallAPI("Home", "Add", data, function (response) { 
     if(response) { 
      alert(response.Message); //This property always exist 
     } 
     else { 
      alert("internet/connection error."); 
     } 
    }); 
} 

我的控制器是:

[System.Web.Http.HttpPost] 
public HttpResponseMessage Add(int userID, int someValue) 
{ 
    //Here! 
    return Request.CreateResponse(HttpStatusCode.OK, new GenericResponseAPI() { Status = false, Message = "Generic Message." }); 
} 

我可以創建一個模型,MVC將其綁定相應地,但我有這麼多的請求,我不想創建各種模型(或包含所有屬性的大模型),而是使用這些基本類型參​​數來實現這些簡單函數。

如何在不改變傳入消息的內容類型的情況下使用上述控制器功能,需要做些什麼?

編輯:我發現這是一個解決辦法:

[System.Web.Http.HttpPost] 
public HttpResponseMessage Add(JObject jObject) 
{ 
    int userID = (int)jObject.getValue("userID").ToObject(typeof(Int32)); 
    int someValue = (int)jObject.getValue("someValue").ToObject(typeof(Int32)); 

    return Request.CreateResponse(HttpStatusCode.OK); 
} 
+0

確切的問題是什麼?參數沒有像你期望的那樣受到約束? – Shoe 2014-11-03 16:03:28

+0

@Shoe Nope,該函數甚至沒有被調用,我得到一個資源未找到JavaScript錯誤。如果我更改JavaScript調用方通過查詢字符串發送,而不是json發佈數據,它雖然工作。 – Danicco 2014-11-03 16:06:05

+0

嘗試將'System.Web.Http.HttpPost'更改爲'System.Web.Mvc.HttpPost' – Shoe 2014-11-03 16:10:23

回答

0

我想象的原因是你的function簽名是:

function CallAPI(controllerName, functionName, sendData, callback) 

和你打電話

CallAPI("Home", "Add", function (response) { ... }) 

所以你永遠不會發送g數據格式爲MVC所期望的。

我想用Fiddler之類的東西來重複檢查一下,並使用瀏覽器開發工具來調試你的JavaScript代碼。

+0

這是一個錯字,我不小心忘記在問題中輸入那個(但它在代碼中)。抱歉! (我知道它正在工作,我有其他各種功能被調用,他們正在工作,但它的數量不斷增加,我想找到一種方法來處理,而無需爲所有請求創建新模型) – Danicco 2014-11-03 16:26:20

+0

@Danicco I建議在這種情況下更新問題! :P – 2014-11-03 16:27:20