2011-09-08 6 views
1

을 감안할 때 다음과 같은 파생 된 형식 유형 기술자와 바인딩목록 <BaseType> 모델

[HttpPost] 
public ActionResult UpdateMultiple(List<Base> items) { 
    for each (var item in items) { 
     if (item.GetType().Equals(typeof(Contact)) { 
      // update 
     } else if (item.GetType().Equals(typeof(Organization)) { 
      // update 
     } 
    } 
    return RedirectToAction("index"); 
} 

내 계획은 각 항목이다

<input type="hidden" name="items[0].EntityType" value="MyNamespace.Contact, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
<input type="text" name="items[0].FirstName" /> 
<input type="text" name="items[0].LastName" /> 

<input type="hidden" name="items[1].EntityType" value="MyNamespace.Organization, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
<input type="text" name="items[1].Name" /> 

맞춤형 입력란을 개발했습니다. (컬렉션 이외의) 단일 개체에 대해 :

public class EntityTypeModelBinder : DefaultModelBinder 
    { 
     protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
     { 
      var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".EntityType"); 
      var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)),true); 
      var model = Activator.CreateInstance(type); 
      bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); 
      return model; 
     } 
    } 

그러나이 모델 바인더를 컬렉션을 처리하기 위해 변환 할 수있는 방법에 대한 제안이있는 사람이 있습니까? 나는 잃어 버렸다.

감사합니다. 응답에 감사드립니다.

hal

답변

1

표시 한 모델 바인더는 이미 컬렉션을 처리합니다. 당신이 필요에 다음 줄을 추가하는 것입니다 Application_Start :

ModelBinders.Binders.Add(typeof(Base), new EntityTypeModelBinder()); 

그것은 충분히 지적하고 그것뿐만 아니라 List<Base> 모델 바인더가 등록되어 있지 않기 때문에 컬렉션으로 작동이 그 것이다 기본 모델 바인더 될 것입니다 호출된다. 컬렉션이 있음을 감지하고 컬렉션의 각 요소에 대해 해당 모델 바인더를 호출합니다. Base 유형의 모델 바인더를 등록했기 때문에 사용자 정의 바인더가 자동으로 사용됩니다.