2012-05-24 3 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

시도처럼 정말 해달라고 : 당신이 application/json 페이로드를 보내는 경우,이 말했다되고 이제

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

다음

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

과 :

왜 거룩한 지구에 당신은 간단하게 정의하고 뷰 모델을 사용하는 대신 직접 요청 스트림을 읽을 귀찮게

ASP.NET MVC 3에는 JSON 요청을 모델에 자동으로 바인딩 할 수있는 JsonValueProviderFactory이 내장되어 있습니다. 그리고 이전 버전을 사용하는 경우 필 하크 (Phil Haack)가 설명한 것처럼 자신의 공장을 추가하기가 쉽습니다. his blog post.

+2

ty "왜 지구상 ...?"에 관해서는, 내 경우에는 어떤 견해 나 모델도 없습니다. 내 전화는 모두 순수한 AJAX 전화입니다. 나는 단순히 MVC의 C 부분을 'REST'서버 측의 멋진 프레임 워크로 사용하고있다. 또한 Microsoft json 지원 복잡한 유형에 좋지 않아, 대신 json.net 사용 – pm100

+1

Request.InputStream.Position = 0; 유효한 대답입니다. –