2012-05-24 44 views
0

我不得不asp.net MVC 3 - 在paramterized控制器方法讀取POST負載

[HttpPost]   
public ActionResult Foo() 
{ 
    // read HTTP payload 
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength)); 
.... 
} 

有效載荷是應用/ JSON;工作得很好;然後我改爲

public ActionResult Foo(string thing) 
{ 
.... 
} 

的意圖是張貼到MyController/Foo?thing=yo 現在我不能讀取有效載荷(長度爲正確的,但該流爲空)。我的猜測是,控制器管道已經吃掉了有效載荷,尋找可以映射到方法參數的表單發佈數據。有沒有什麼方法可以阻止這種行爲(當然,MVC不應該吃掉其類型標記爲JSON的有效載荷,它只應該查看錶單發佈數據)。我的解決辦法是「東西」添加到JSON,但我真的不喜歡那個

回答

3

嘗試閱讀之前復位輸入流中的位置:

public ActionResult Foo(string thing) 
{ 
    Request.InputStream.Position = 0; 
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength)); 
    .... 
} 

現在,這就是說,如果您正在發送application/json有效載荷爲什麼神聖地球上難爲的簡單定義和使用視圖模型直接讀取請求流來代替:

public class MyViewModel 
{ 
    public string Thing { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    ... 
} 

然後:

public ActionResult Foo(MyViewModel model) 
{ 
    // use the model here 
    .... 
} 

ASP.NET MVC 3有一個內置的JsonValueProviderFactory它允許您自動綁定JSON請求到模型。如果你使用的是舊版本,那麼像Phil Haack在his blog post中說明的那樣添加這樣的工廠非常容易。

+2

ty關於你的「爲什麼在地球上,...」,在我的情況下,沒有意見或模型。我的電話都是純粹的AJAX呼叫。我只是將MVC的C部分用作'REST'服務器端的一個很好的框架。微軟的json支持對於複雜類型並不好,我使用json.net代替 – pm100

+1

Request.InputStream.Position = 0;是一個有效的答案。 –