2012-06-22 2 views
5

ASP.NET MVC 4 RC 웹 API에서 이상한 바인딩 문제로 간주되는 것을 얻고 있습니다. 클라이언트로부터의 게시물 요청을 수락하기위한 메소드가 있습니다. 문제는 post 메서드가 호출 될 때 바인딩 매개 변수가 없다는 것입니다. throw 줄과 이름에서 내 중단 점을 얻습니다. 전자 메일은 모두 null입니다. JavaScript에서 GET 요청 유형을 변경하면 매개 변수가 바인딩 된 아래의 Get 함수가 호출됩니다.ASP.NET MVC 4 RC 웹 API 매개 변수 바인딩 문제

왜 Post 메서드에 대한 매개 변수 바인딩이 실패하고 어떻게 해결할 수 있습니까?

send: function(evt) { 
    evt.preventDefault(); 
    $.ajax({ 
     url: '/api/person', 
     data: this.model.toJSON(), 
     type: "POST", 
     dataType: "json", 
     success: function(data) { 
      console.log("Success"); 
     }, 
     error: function(data) { 
      console.log("Error"); 
     } 
    }); 
    } 

다음 컨트롤러 작업입니다 :

public void Get(string name, string email) { 
    throw new NotImplementedException(); 
} 

public void Post(string name, string email) { 
    throw new NotImplementedException(); 
} 

참고 : 나는 ASP.NET MVC 4 RC 웹 API에 대한 기본값 (그래서 디시리얼라이저을 모두 사용하고

  • JS 디버거의 Chrome 네트워크 탭에는 양식의 매개 변수가 올바르게 표시됩니다.

답변

13

MVC (웹 페이지)와 달리 간단한 매개 변수 유형은 will not, by default, bind from the post body but instead from the URI입니다. 따라서 코드를 그대로 사용하면 검색어 문자열에 nameemail 매개 변수를 전달해야하거나 경로 매개 변수로 전달해야합니다.

그러나 모델 유형 (MVC 모국어)을 만들고 메소드 매개 변수에이를 사용하여 쉽게 해결할 수 있습니다. 나는이 방법 단지 때문에 대한 반환 형식에 갇혀 한

public class SomeParams { 
    public string name { get; set; } 
    public string email { get; set; } 
} 

//now an alternative way to write the Get method 
public MyResult Get([FromUri] SomeParams p){ 
    //members are bound from the query string (more like MVC traditional binding) 
    //note - as in MVC, SomeParams will need a default constructor for this to work. 
} 

public PostResult Post(SomeParams p){ 
    //'p' is bound from your JSON (assuming correct format) 
    //because 'complex' types are deserialized using formatters 
    //only one object can be read from the body with a formatter in Web API 
    //as the request body is not buffered; unlike MVC. 
} 

: 그런 다음 get 메소드에 [FromUri]를 사용하는 경우 사실 당신은 (당신이 준 경우) 모두에 사용할 수 있습니다 그들은 뭔가를 돌려 줄 필요가 있습니다!

나는 마이크 스톨 (Mike Stall)의 기사 (위와 다른 많은 것들)에 대한 링크를 읽는 것이 좋습니다.

웹 API는 MVC와 동일한 패러다임과 클래스 이름을 공유하기 때문에 MVC와 실제로 동일하다고 가정하는 것이 유혹적이지만 그렇지 않습니다. 처음에는 이것이 왜 그런지 궁금했습니다. (저는 MVC 위에 많은 REST 서비스를 작성했고, 몇 가지 유틸리티 클래스와 기본 클래스 향상 기능을 작성한 후에는 멋지다고 생각했습니다.) 그들은 웹 API 작성의 어려움을 적절하게 살펴 봤으며 아마도 그들이 가지고있는 접근 방식을 변경 한 것이 맞을 것이라고 생각합니다.

그러나 지금 당장 취할 수있는 몇 가지 사항을 취한 다음 웹 API에 대해 다시 배워야한다는 것을 의미합니다.

+0

get 매개 변수가 void가 아니며 사실 존재하지 않습니다. 나는 명확하지 않을 수도 있지만 기능이 GET에서 작동하고 POST에서는 작동하지 않는다는 것을 설명하기위한 것입니다. – Cody

+1

오케이 - 잘 됐네요. :) 간단히 말해 요청의 본문에서 여러 매개 변수를 바인딩하는 경우 기본적으로 내가 수행 한 것처럼 간단한 모델 유형을 작성하는 것이 가장 쉬운 방법입니다. –

+0

마이크 스톨 (Mike Stall) 기사 링크 주셔서 감사합니다. 무슨 일이 일어나고 있는지 매우 유익했습니다. 나는 웹 API가 MVC와 똑같은 바인딩 전략을 사용한다고 가정했다. 매력처럼 작동하는 매개 변수를받는 사용자 지정 클래스를 만드는 것은 그 솔루션의 팬이 아니지만 이유를 파악할 수 없기 때문에 아마도 완고 할지도 모릅니다. :) 어쨌든 그것은 제가 사용할 해결책입니다. 감사!:) – Cody