2010-06-29 3 views
0

SWFUpload를 사용하여 파일을 업로드합니다. 파일과 함께 전달해야하는 데이터를 얻으려면 swfupload에 post params를 추가합니다. 문제는 컨트롤러 메서드가 swfupload에 의해 호출 될 때 내가 작성한 사용자 정의 모델 바인더가 호출되지 않는다는 것입니다. 내 모델의 일부 속성이 설정되지만 사용자 정의 바인더로 제어되는 속성은 설정되지 않습니다. 즉, 기본 모델 바인더를 사용하고 있습니다..NET MVC 2.0 SWFUpload를 사용할 때 사용자 지정 모델 바인더가 호출되지 않습니다.

다음 JQuery 메서드를 사용할 때 모든 것이 의도 한대로 작동합니다. 그래서 문제는 내 사용자 정의 모델 바인더가 잘못 설정되지 않았다는 것입니다.

$.post('AsyncUpload', $('#uploadform').serialize()); 

다음은 게시 매개 변수를 설정하고 업로드 프로세스를 시작하기 위해 사용하는 코드입니다. 나 setPostParams 함수를 알고 있지만, 그것은 나를 위해, 따라서 주위에 작동하지 않는 몇 가지 이유로 유의하십시오. 또한 서버 측의 요청 변수에 게시 매개 변수가 올바르게 설정되어 있는지 확인했습니다.

$('#uploadbutton').click(function (e) { 
    e.preventDefault(); 
    var data = $('#uploadform').serialize(); 
    var res = $.parseQuery(data); 

    for (key in res) { 
      swfu.addPostParam(key, res[key]); 
    } 

    swfu.startUpload(); 
}); 

해당 swfupload 변수는 다음과 같이 설정됩니다.

upload_url: '<%= Url.Action("AsyncUpload")%>', //This becomes /Home/AsyncUpload 
use_query_string: true, // I have also tried setting this to false to no effect 

이것은 제 컨트롤러 방법입니다.

[HttpPost] 
public bool AsyncUpload(EditModel model) 
{ 
    if (Request.Files.Count <= 0) 
     return false; 

    return true; 
} 

사용자 정의 모델 바인더가 호출되지 않는 이유는 무엇입니까?

+0

제가 생각할 수있는 유일한 점은 EditModel 유형의 속성과 일치하지 않는 양식 이름 불일치 (게시물 데이터의 키 이름)가 있다는 것입니다. 모든 양식 이름/우편 데이터 키가 모델의 등록 정보와 동일한 지 확인 했습니까? –

+0

나는 그들이 그것이 맞다는 것을 확인했고, 나는 그것들이라고 생각했지만, 나는 미묘하게 잘못되었다. 내가 찾은 것에 대답 하겠지만, 올바른 방향으로 나를 밀어 주셔서 감사합니다. 나는 이것을 잠시 동안 고민하고있다. –

답변

0

문제의 원인은 문자 인코딩입니다. 내 사용자 정의 모델 바인더는 사전 특성을 처리하도록 작성되었습니다. 나는 텍스트 상자 컨트롤과 체크 박스를 클라이언트 측에

[HttpPost] 
public bool AsyncUpload(EditModel model) 
{ 
    if (Request.Files.Count <= 0) 
     return false; 

    return true; 
} 

:

public class EditModel 
{ 
    public string Name { get; set; } 
    public Dictionary<int, string> Type { get; set; } 
} 

내 질문에 명시된 바와 같이, 컨트롤러 방법은 다음과 같습니다 :

내 모델은이 같은 비트 보이는 . 텍스트 상자는 문자열 속성에 매핑됩니다. 확인란은 사전 속성에 매핑되며 대괄호에서 키를 추출하기 위해 내 사용자 정의 모델 바인더로 구문 분석하는 "Type [0]", "Type [7]"등과 같은 이름을 갖습니다. 예상대로 컨트롤러로 전송 쿼리 문자열이 5B0 %가 5D는 형식으로 디코딩

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%5B0%5D 

유형 %이기 때문에 jQuery를 기능

$.get('AsyncUpload', $('#uploadform').serialize()); 

를 호출 할 때 지금

는, 모든 일 [0] . MVC는 사전으로서 우리는 경주를 끝낸다는 것을 알고 있습니다.

이미 인코딩 된 문자열을 SWFUpload addPostParam 함수에 전달하는 것이 문제였습니다. 'Type % 5B0 % 5D'이고 '%'를 % 25 (으)로 인코딩하는 설정 값을 사용하고있었습니다. 그래서 SWFUpload에서 쿼리 문자열했다 :

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%255B0%255D 

유형이 다음 MVC에 의해 사전으로 인식되지 않는 유형 % 5B0 %의 5D로 디코딩했다. 기본 모델 바인더는 간단한 문자열 속성을 처리하는 방법을 알고 있기 때문에 이름이 올바르게 설정됩니다.

문제를 해결하기 위해 자바 스크립트를 다음과 같이 변경했습니다. 브라켓 인코딩을 실제 대괄호로 바꿉니다. 그러면 서버에 대한 호출에서 다시 인코딩되어 모든 것이 우주와 잘 맞을 것입니다. 내가 이름을 다시 한번 서버로 전달되는이 원인이 내 게시물에 댓글을 달고 마태 복음 애보트에

for (key in res) { 
    var value = res[key]; 
    var fixedKey = key; 
    fixedKey = fixedKey.replace('%5B', '['); 
    fixedKey = fixedKey.replace('%5D', ']'); 
    swfu.addPostParam(fixedKey, value); 
} 

많은 감사합니다. 넌 내 정신을 구 했어.