2010-01-26 11 views
10

ASP.Net MVC에서 컨트롤러에 게시 할 때 표준 QueryStrings와 반대로 JSON을 보낼 수 있기를 원합니다. 프론트 엔드 물건을 잘 (건물 내 JSON 개체를 제출) 일하고있다.ASP.Net MVC : 컨트롤러에 JSON 보내기

MVC 프레임 워크와 함께 제공되는 기본 ModelBinders가 지원하지 않는 컨트롤러 쪽에서 문제가 발생합니다.

나는이 문제를 해결하기 위해 매개 변수로 객체를 사용하는 필터를 적용하고 JSON 라이브러리를 사용하여이를 역 직렬화 한 다음 동작 매개 변수에 추가하는 방법을 살펴 보았습니다. 이상적이지 않습니다.

더 좋은 방법은 맞춤형 모델 바인더를 사용하는 것입니다. 내가 본 모든 것들은 당신이 단 하나의 모델을 가지고 있다고 가정하고 변수가 아닌 클래스가 될 것입니다. 여러 명이 있다면 고장이납니다.

누구에게도이 문제가 발생 했습니까? 내가 가진 한 가지 생각은 MVC가 FormCollection을 다루는 방법을 간단히 재정의하고 컬렉션에 값을 추가하고 MVC가 정상적인 방법으로 나머지 작업을 수행 할 수 있기를 바라는 것입니다. 그게 가능한지 아는 사람 있습니까?

중요한 문제는 내보기 모델이 이전과 다른 방식이 아니기 때문에 제 문제가 바인딩과 관련이 없다는 것입니다. 문제는 JSON Post에서 값을 가져 오는 것입니다.

내가 올바른 경우 MVC는 QueryString에서 값을 가져 와서 ModelBinding에 사용되는 양식 콜렉션에 넣습니다. 올바른 방법으로 FormCollection의 할당 방식을 변경해서는 안됩니까? 액션의

예 :

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails) 
{ 
//etc 
} 

정상 바인딩 작품, JSON 중 하나가 작동하지 않을 수 없습니다 및 모델 바인더의 모든 예 않습니다. 지금까지의 가장 좋은 해결책은 객체를 사전으로 변환하고 각각의 param을 반복하고 그것을 일치시키는 것입니다. 이상적인 것 같지 않습니다.

+0

투표하려면 아래 이유를 설명해주세요. – Damien

+0

죄송합니다. 유감스럽게도 내가 좋아하는 스타를 클릭했을 때, 이미 upvoted 한 후에도 우연히 투표를 클릭했습니다 (그것이 5에서 3으로 변경된 이유입니다). 그리고 지금 제가 우연히 한 것을 되돌리려 고 시도한 직후, 질문이 수정되지 않는 한, 투표를 변경하기에는 너무 늦었다 고 말했습니다. 질문을 수정하면 기꺼이 내 표를 고칠 수 있습니다. – jamesaharvey

+0

문제가 없습니다! 그것은 나에게도 많은 시간이 걸린다. – Damien

답변

8

나는이 같은 JSON에 대한 사용자 정의 모델 바인더를 사용 : 다음

public class JsonModelBinder<T> : IModelBinder { 
    private string key; 

    public JsonModelBinder(string requestKey) { 
     this.key = requestKey; 
    } 

    public object BindModel(ControllerContext controllerContext, ...) { 
     var json = controllerContext.HttpContext.Request[key]; 
     return new JsonSerializer().Deserialize<T>(json); 
    } 
} 

그리고이 같은 Global.asax.cs에서 그것을 철사 :

ModelBinders.Binders.Add(
    typeof(Product), 
    new JsonModelBinder<Product>("ProductJson")); 

당신이에 대한 자세한 내용을 여기 읽을 수 있습니다 : Inheritance is Evil: The Epic Fail of the DataAnnotationsModelBinder

편집

JsonModelBinder는 제품으로 입력 한 컨트롤러 작업 매개 변수에서만 사용해야합니다. Int32 및 ClassObject는 DefaultModelBinder로 떨어집니다. 다른 결과가 있습니까?

+0

그래서 사용할 유형을 정의해야합니까? – Damien

+0

예, 유형을 지정해야합니다. 좀 더 자세하게 상황을 설명해 주시겠습니까? 나는 최근에 모델 바인딩을 더 파고 들었고 거기에 비 명백한 기능이 많이 있습니다. –

+0

글쎄, 타입과 함께 원시 타입/스팅 인 액션 파라미터에 대해서는 어떻게해야합니까? Int32 ID, 클래스 제품을 보내면 문제가 발생합니다 – Damien

관련 문제