2012-06-28 3 views
1

ASP.NET MVC3 사용자 정의 모델 바인더 문제 : 양식이 제출내가 태그 목록이 포함 된 신청자 모델이

public class Applicant 
{ 
    public virtual IList<Tag> Tags { get; protected set; } 
} 

는 태그의 쉼표로 구분 된 목록을 포함하는 입력 필드가있다 사용자가 입력합니다. 내 모델은 인구 및 POST에 대한 컨트롤러 액션에 전달 될 때

public class TagListModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var incomingData = bindingContext.ValueProvider.GetValue("tags").AttemptedValue; 
     IList<Tag> tags = incomingData.Split(',').Select(data => new Tag { TagName = data.Trim() }).ToList(); 
     return tags; 
    } 
} 

그러나, 태그의 속성이 여전히 비어있는 목록입니다 : 내가 컬렉션에이 목록을 변환하는 사용자 정의 모델 바인더가 있습니다. 왜 목록을 올바르게 채우지 못하는지 알기 원하십니까?

+0

http://prideparrot.com/blog/archive/2012/6/customizing_property_binding_through_attributes – VJAI

+0

@ 마크 난 당신의 링크가 제안 하듯이 전체 모델 바인더를 교체 할 이유가 표시되지 않습니다. –

+0

제 대답을 확인하십시오 – VJAI

답변

2

문제는 당신이 Tags 속성에 protected set 접근이있다. 아래 내용을 public으로 변경하면 정상적으로 작동합니다.

public class Applicant 
{ 
    public virtual IList<Tag> Tags { get; set; } 
} 
2

모델 바인더는 제출 된 값만 바인드합니다. 뷰에서 렌더링 된 값은 바인딩하지 않습니다.

필요에 따라 태그를 렌더링하려면 사용자 정의 EditorTemplate을 만들어야합니다.

1

MVC는 already bind to a List입니다. 이미 필요한 기능을 갖춘 내장 기술을 사용하는 것이 좋습니다.

바인더 추가에 대한 코드를 찾지 못했습니다. ModelBinder를 바인더에 추가 했습니까?

protected void Application_Start() 
{ 
    ModelBinders.Binders.Add(typeof(IList<Tag>), new TagListModelBinder()); 
} 
+0

예, 바인더에 추가했는데 호출되었습니다. action 메소드 매개 변수에는 채워지지 않습니다. – arknotts

+0

목록에 바인딩하는 방법에 대한 링크를 확인했습니다. 불행히도 내 시나리오에서는 클라이언트 측에서 사용하는 javascript가 모든 입력 필드에 모든 것을 적용하기 때문에 작동하지 않습니다. – arknotts

관련 문제