2014-04-10 30 views
1

我只是想將一個簡單的對象傳遞給一個MVC控制器方法,而不必爲它創建一個視圖模型。控制器方法中的參數始終爲空,儘管它已被調用。我的jquery文章如下。用jquery發佈簡單的json到MVC動作控制器方法

$(function() { 
    $("button[id$='addidentifier']").click(function (evt) { 
     alert('button click'); 
     evt.preventDefault(); 
     var postdata = { 
      identifier: $('#Identifier').val(), 
      goldkey: $('#Goldkey').val() 
     }; 
     $.ajax({ 
      type: 'POST', 
      url: 'altbloomberg/AddIdentifier', 
      data: JSON.stringify({ postdata : postdata }) , 
      success: function(data) { 
       alert('data: ' + data); 
      }, 
      failure: function(a,b,c) { 
       alert(a); 
      }, 
      //contentType: "application/json", 
      dataType: 'json'//, 
      //processData: false 
     }); 
    }); 

控制器方法很簡單,我甚至沒有完成它的主體,因爲我想先獲取數據。

[System.Web.Http.HttpPost] 
    public ActionResult AddIdentifier(string postdata) 
    { 
      // put here to place a breakpoint to look at postdata 
      string lookhere = ""; 
    } 

我已經看了其他崗位,這是他們「似乎」,以指示做。這似乎應該很容易。那麼我在這裏做錯了什麼?

每下面一些建議:我改變jquery的函數來傳遞

  $.ajax({ 
      type: 'POST', 
      url: 'altbloomberg/AddIdentifier', 
      contentType: "application/json", 
      dataType: 'json', 
      data: JSON.stringify(postdata), 
      success: function(data) { 
       alert('data: ' + data); 
      }, 
      failure: function(a,b,c) { 
       alert(a); 
      } 
     }); 

我只是改變了字符串化方法PARAMS和設置內容類型,則改爲控制器PARAMS到

(string identifier, string goldkey). 

這作爲stringify方法的結果是

"{"identifier":"XS0939678792","goldkey":"LAW"}" 

那麼爲什麼是它那麼如果我只使用一個PARAM在控制器方法

(String postdata) 

,並使用

JSON.Stringify({postdata:postdata}) 

其結果是

"{"postdata":{"identifier":"XS0939678792","goldkey":"GOVT"}}" does it NOT work. 

不應以POSTDATA控制器匹配方法json值?

+0

是否成功輸入了斷點?如果不是,你應該嘗試通過@ Url.Action指定控制器/動作 – Dbl

+0

是的,它進入了中斷點,但postdata總是爲空 – DRobertE

+0

@denas是的,它只會是null。你發送的json數據不是一個簡單的字符串 – SivaRajini

回答

2

AddIdentifier操作的參數應該是具有'identifier'和'goldkey'屬性的模型,或者是每個屬性的字符串參數。

像這樣:

[System.Web.Http.HttpPost] 
public ActionResult AddIdentifier(Identifier model) 

或本:

[System.Web.Http.HttpPost] 
public ActionResult AddIdentifier(string identifier, string goldkey) 

如果你真的想將字符串數據,那麼你可以把數據類型:「JSON」出來,它將只發送字符串。

編輯

根據您的意見,似乎你想要的東西更有活力。您可以將您的postdata參數的類型從字符串更改爲動態。我不確定這是否可以開箱即用。如果沒有,您可以創建自己的自定義模型聯編程序以將數據綁定到動態參數。

http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder

如果我是你,我會堅持的創建模型或定義參數的前兩個選項之一,但。

+0

有點想讓這兩個世界更容易,我不想爲每個控制器方法創建一個模型「標識符」或其他模型,我不想添加每次我在json對象中添加一個新參數時,控制器簽名的新參數。我只想匹配頂層json對象,因爲我已經編輯過 – DRobertE

+0

僅僅使用模型就已經結束了。動態沒有開箱即用,並沒有意義做出自定義... drat – DRobertE

3

我認爲你必須創建一個簡單的模型來接收數據。

例如,這是你的行動:

[System.Web.Http.HttpPost] 
public ActionResult AddIdentifier(PostDataModel postdata) 
{ 

} 

其中PostDataModel是這種結構一個簡單的模型:

class PostDataModel { 
    public string Identifier {get;set;} 
    public string GoldKey {get;set;} 
} 

,你必須使這條線在你的Ajax請求:

contentType: "application/json", 
+0

這就是我想要避免的,導致然後每次我添加一個新的JSON屬性我必須編輯模型,然後編輯控制器。 – DRobertE

+0

我認爲這取決於您的最終目標,您可以使用PostDataModel作爲DTO,這樣您只需向PostDataModel添加新屬性並將PostDataModel作爲參數 – Ragnar

+0

傳遞給其他方法,並且如果刪除dataType:'json'它不起作用? – Ragnar

相關問題