2012-03-02 4 views
2

나는 최근에 내가 말했다 경우 것으로 나타났다. 이는 here이라는 문제가 원인입니다. 이 문제를 해결하기 위해 문제를 해결했습니다. 그러나 latestPosts를 기존 유형 (예 : 위젯)의 속성 (매개 변수)으로 이동하면 모델을 업데이트하지 않습니다. 예 :모델 바인딩 런타임 유형

var widget = new Widget(); 
MyTryUpdateModel(widget, "Widget", null, null, ValueProvider); // LatestPosts doesn't update 

그러나 다음 작업을 수행하십시오 LatestPosts 클래스

public class Widget {   
    [Required, StringLength(100)] 
    public virtual string Name { get; set; } 

    private object _parameters; 
    public virtual object Parameters { 
     get { 
      // Code removed for brevity 
      if (_parameters == null) 
       _parameters = new MyApp.Models.LatestPosts(); 

      return _parameters; 
     } set { _parameters = value; } 
    } 
} 

그리고 여기 :

public class LatestPosts { 
    public int NumPosts { get; set; } 
} 

내가 할 수있는 '를

MyTryUpdateModel(widget.Parameters, "Widget.Parameters", null, null, ValueProvider); 

편집 : 다음은 위젯 클래스의 초기 MyTryUpdateModel이 작동하지 않는 이유를 확인하십시오. 복잡한 유형을 처리해야하기 때문에 위젯 전체를 업데이트해야합니다. 누군가가이 문제에 대해 밝힐 수 있다면 고맙겠습니다.

감사

+0

문제를 재현 할 수 없습니다. 둘 모두 나를 위해 일합니다. 모델 클래스가 어떻게 생겼는지, 정확하게 요청에서 값으로 전송되는 것을 포함하여 문제를 재현 할 수있는 완전한 예제를 제공 할 수 있습니까? –

+0

안녕하세요. 안녕하세요. 도움이 필요한 정보를 가지고 문제를 편집했습니다. 감사합니다 – nfplee

+0

TryUpdateModel/UpdateModel을 사용하지 마십시오 – Omu

답변

0
내가 explaim 것

모두 "패치 TryUpdateNode이 경우 작동하지 않는 이유. 나는 MVC의 코디네이터가 복잡한 사용자 정의 모델을 포함 툴킷을 제어 나는 왜 원래 TryUpdateModel가 작동하지 않고 Binder, Model Binder와 그 문제의 깊은 지식을 습득했습니다.

Default TryUpdateModel : DefaultModelBinder를 호출했습니다. 이제 모델 바인딩 프로세스 중에 얻은 정보를 기반으로 런타임에 유형을 결정하는 것이 위험합니다. 이러한 정보는 클라이언트에서 가져온 것이므로 악의있는 ​​사용자가 조작 할 수 있습니다. 이렇게하면 모델 바인더가 인스턴스를 만들 수 있습니다 그가 결정한 유형의 .... 매우 위험한 ... 그는 모델 바인더가 "가짜"유형의 생성자에있는 원치 않는 악의적 인 코드를 실행하도록 강제 할 수 있습니다. 따라서 일반적인 디자인 선택은 모델 바인더에서 사용되는 모든 유형이 컴파일 시간에 결정되어야한다는 것입니다.

MyTryUpdateModel : GetType을 호출하여 루트 모델의 유형을 결정한 다음이 정보를 사용하여 기본 모델 바인더를 호출합니다 이 유형에. 그러나이 initia "startup"을 제외하고 모델 바인더는 평소와 같이 작동합니다. 즉 ... 루트 모델의 속성 유형, GetType 또는 런타임 정보로 얻지 못했지만 검사 만하면됩니다. 루트 모델의 프로퍼티의 타입 ... 당신의 경우에는 객체라는 것이 ... 정보가 없음을 의미합니다.

Mvc Controls Toolkit의 비정상적인 사용자 정의 모델 바인더에는 런타임시 유형을 결정하는 도구가 있지만 모든 유형이 아닙니다. 왜냐하면 "안전"유형의 부속 유형 인 attcks ... 유형의 위험에 노출되기 때문입니다 .. 인터페이스를 구현하는 인스턴스 유형.

+0

고마워, 나는 내 초기 문제가 사용자 정의 모델 바인더를 사용하여 해결 될 수 있기를 기대했다. 이미 내 자신의 사용자 정의 모델 바인더가 있지만이 기능을 추가하는 것이 좋습니다. ExDefaultBinder.cs 파일의 코드를 빠르게 살펴 봤지만 정확히 처리 할 수있는 정확한 비트를 정확히 지적 할 수는 없습니다. 이를 달성하는 데 필요한 코드 만 사용하여 버려진 버전을 보여줄 수 있다면 고맙겠습니다.감사합니다 – nfplee

+0

그렇게 쉽게, ExDefaulModelBinder 그냥 확장 지점을 추가합니다. 변환 처리기를 작성하여 "새 비헤이비어"를 지정할 수 있습니다. 대부분의 Mvc Controls Toolkit 컨트롤에는 변환 핸들러가 자동으로 하위 클래스를 감지합니다. 그러나 당신은 변환 핸들러를 부착 할 속성을 지정해야합니다! 변환 핸들러는 기본적으로 컨트롤 상태를 다시 빌드하는 작업을 수행하지만 특정 ViewMdel 속성에서 "컨트롤"또는 비헤이비어를 첨부해야합니다. 모든 속성에서 동작을 수정하려면 내 사용자 정의 모델 바인더를 사용할 수 없습니다. –

+0

모든 속성에서 클래스를 감지하는 custo 바인더를 작성하는 것은 어렵지 않지만 값이 모델에서 미리 지정되어 있지 않고 작성해야하는 경우 만들려는 하위 유형의 정보가 필요합니다. 예를 들어 매개 변수 속성이 null 일 수있는 경우에는 모델 바인더가이를 만들 수 있어야합니다. 그러나 어떻게? ... ExDefaultModelBinder는 페이지가 렌더링 될 때 숨겨진 필드에 작성된 정보를 사용합니다.이 숨겨진 파일을 게시하면 생성 할 유형의 정보를 읽을 수 있습니다. 이 점에 대해 더 많은 정보를 제공하면 일부 코드를 게시 할 수 있습니다 –